Ever tried to share a medical record with a specialist or let a tax app see your bank data without just handing over your password? It's usually a mess of "all or nothing" permissions that makes security teams lose sleep.
User Managed Access, or uma, is basically oauth2 but with a brain for privacy. It lets the actual owner of the data—not just the admin—decide who gets in.
Traditional oauth is great for "I let this app post to my feed," but it fails when you want to share your stuff with someone else. UMA 2.0 fixes this by adding a centralized way to manage these messy relationships.
To get this working, you need a few moving parts talking to each other:
In a finance setup, a user might let their accountant (RqP) see "2023 Tax Docs" via a portal (Client) without giving them the keys to the whole vault.
Next, we'll dig into why this is actually a game changer for modern security architectures.
Implementing uma in an enterprise setting is basically taking the "who are you" of oidc and mixing it with a "what can you actually do" policy engine that doesn't live inside your app code. It’s a relief for devs because you stop writing custom if/else logic for every sharing request.
The magic happens with the permission ticket. When a user tries to access a protected file, the resource server doesn't just say "no." It hands back a ticket. This ticket is like a claim check at a coat room; the client app takes it to the authorization server to prove what it’s looking for.
need_info status or a "pending" state. The request stays in a queue until the owner logs in later and hits "Approve," at which point the client can finally trade that ticket for an RPT.In a typical ciam setup, you want to decouple the resource (the data) from the policy (the rules). This is great for scaling. If you're a healthcare provider, you might have thousands of patient records. You don't want to hardcode who can see what in the database.
Instead, the resource server just knows how to talk to the authorization server. This allows for scaling access control across different departments or even third-party partners without rebuilding your auth logic every time a new privacy law drops.
Look, as a cto, you're probably tired of hearing about "compliance" like it's just a checkbox. But when you're scaling a saas platform, privacy isn't just a legal headache—it's a massive technical bottleneck.
The big shift with gdpr is that "consent" isn't a one-time thing. Users need to be able to revoke access to specific bits of data whenever they want. If you hardcode these rules into your database, you're creating a maintenance nightmare.
UMA helps you offload that liability. Instead of your backend being the "source of truth" for every tiny permission, the user sets the policy. This reduces your "blast radius" because you aren't managing a giant, static list of who can see what.
Getting UMA to play nice with your existing stack can feel like trying to plug a toaster into a car engine. This is especially true with directory sync. UMA often involves mapping identities across different organizations (the Owner’s company vs. the Requestor’s company), which is a total nightmare to orchestrate manually. This is where a platform like SSOJet makes sense. It acts as the glue, handling the messy directory orchestration and token exchanges so your devs can focus on the product.
Next, we'll look at how to actually get this live, while navigating the technical hurdles and best practices that come with a real deployment.
Implementing uma isn't exactly a "plug and play" Sunday afternoon project. If you've ever tried to sync complex permissions across a legacy saml setup and a modern oidc flow, you know the devil is always in the details.
One big headache is the "Scope Explosion." When you start letting users manage access for retail apps or health records, it’s tempting to create a unique scope for every tiny action. Pretty soon, your auth server is choking on a database of ten thousand scopes that nobody can track.
Latency is another silent killer. Because UMA requires that extra "handshake" to trade a permission ticket for an RPT, you’re adding round trips to your auth flow. If your AS isn't optimized, your users are gonna sit there staring at a loading spinner.
To actually get this into production, you follow a specific sequence of api calls:
POST /resource_set) and defines what scopes are available (read, share, delete).POST /token with grant_type=urn:ietf:params:oauth:grant-type:uma-ticket).Best Practices:
read:file:123, use read:document and let the resource server handle the specific ID check.Honestly, getting this right is about balancing security with the fact that humans are lazy. If you make it too hard, they’ll find a workaround. But if you use a solid ciam strategy and maybe a bit of help from tools like ssojet as mentioned earlier, you can actually make "privacy by design" a reality without losing your mind.
*** This is a Security Bloggers Network syndicated blog from SSOJet - Enterprise SSO & Identity Solutions authored by SSOJet - Enterprise SSO & Identity Solutions. Read the original post at: https://ssojet.com/blog/what-is-user-managed-access