You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: articles/app-service/configure-authentication-user-identities.md
+38-29Lines changed: 38 additions & 29 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,41 +2,48 @@
2
2
title: Work with User Identities in AuthN/AuthZ
3
3
description: Learn how to access user identities when you use the built-in authentication and authorization in Azure App Service.
4
4
ms.topic: how-to
5
-
ms.date: 03/29/2021
5
+
ms.date: 07/02/2025
6
6
ms.custom: AppServiceIdentity
7
7
author: cephalin
8
8
ms.author: cephalin
9
9
---
10
10
11
11
# Work with user identities in Azure App Service authentication
12
12
13
-
This article shows you how to work with user identities when you use built-in [authentication and authorization in Azure App Service](overview-authentication-authorization.md).
13
+
This article shows you how to work with user identities when you use [built-in authentication and authorization](overview-authentication-authorization.md) in Azure App Service.
14
+
15
+
## Prerequisites
16
+
17
+
A web application running on Azure App Service that has the [App Service authentication/authorization module enabled](scenario-secure-app-authentication-app-service.md).
14
18
15
19
## Access user claims in app code
16
20
17
-
For all language frameworks, App Service makes the claims in the incoming token (whether from an authenticated end user or from a client application) available to your code by injecting them into the request headers. External requests aren't allowed to set these headers, so they're present only if set by App Service.
21
+
Your app's authenticated end users or client applications make claims in incoming tokens. App Service makes the claims available to your code by injecting them into request headers. External requests aren't allowed to set these headers, so they're present only if App Service sets them.
22
+
23
+
You can use the claims information that App Service authentication provides to perform authorization checks in your app code. Code in any language or framework can get needed information from the request headers. Some code frameworks provide extra options that might be more convenient. See [Framework-specific alternatives](#framework-specific-alternatives).
18
24
19
-
Some example headers are described in the following table:
25
+
The following table describes some example headers:
|`X-MS-CLIENT-PRINCIPAL`| A Base64-encoded JSON representation of available claims. For more information, see [Decode the client principal header](#decode-the-client-principal-header). |
24
-
|`X-MS-CLIENT-PRINCIPAL-ID`| An identifier for the caller, which the identity provider sets. |
25
-
|`X-MS-CLIENT-PRINCIPAL-NAME`| A human-readable name for the caller, set by the identity provider, such as an email address or a user principal name. |
30
+
|`X-MS-CLIENT-PRINCIPAL-ID`| An identifier that the identity provider sets for the caller. |
31
+
|`X-MS-CLIENT-PRINCIPAL-NAME`| A human-readable name that the identity provider sets for the caller, such as an email address or user principal name. |
26
32
|`X-MS-CLIENT-PRINCIPAL-IDP`| The name of the identity provider that App Service authentication uses. |
27
33
28
-
Provider tokens are also exposed through similar headers. For example, Microsoft Entra also sets `X-MS-TOKEN-AAD-ACCESS-TOKEN` and `X-MS-TOKEN-AAD-ID-TOKEN` as appropriate.
34
+
Similar headers expose [provider tokens](configure-authentication-oauth-tokens.md). For example, Microsoft Entra sets `X-MS-TOKEN-AAD-ACCESS-TOKEN` and `X-MS-TOKEN-AAD-ID-TOKEN` provider token headers as appropriate.
29
35
30
36
> [!NOTE]
31
-
> Different language frameworks might present these headers to the app code in different formats, such as in lowercase or by using title case.
32
-
33
-
Code that is written in any language or framework can get the information that it needs from these headers. [Decode the client principal header](#decode-the-client-principal-header) covers this process. For some frameworks, the platform also provides extra options that might be more convenient.
37
+
> App Service makes the request headers available to all language frameworks. Different language frameworks might present these headers to the app code in different formats, such as lowercase or title case.
34
38
35
39
### Decode the client principal header
36
40
37
-
`X-MS-CLIENT-PRINCIPAL` contains the full set of available claims as Base64-encoded JSON. These claims go through a default claims-mapping process, so some might have different names than you would see if you processed the token directly.
41
+
The `X-MS-CLIENT-PRINCIPAL` header contains the full set of available claims in Base64-encoded JSON. To process this header, your app must decode the payload and iterate through the `claims` array to find relevant claims.
42
+
43
+
> [!NOTE]
44
+
> These claims undergo a default claims-mapping process, so some names might be different than they appear in the tokens.
38
45
39
-
Here's how the decoded payload is structured:
46
+
The decoded payload structure is as follows:
40
47
41
48
```json
42
49
{
@@ -52,16 +59,18 @@ Here's how the decoded payload is structured:
|`auth_typ`| string | The name of the identity provider that App Service authentication uses. |
58
-
|`claims`| array of objects| An array of objects that represent the available claims. Each object contains `typ` and `val` properties. |
59
-
|`typ`| string | The name of the claim. It might be subject to default claims mapping and might be different from the corresponding claim that is contained in a token. |
67
+
|`claims`| array | An array of objects that represent the available claims. Each object contains `typ` and `val` properties. |
68
+
|`typ`| string | The name of the claim, which might be subject to default claims mapping and be different from the corresponding claim in the token. |
60
69
|`val`| string | The value of the claim. |
61
70
|`name_typ`| string | The name claim type, which is typically a URI that provides scheme information about the `name` claim if one is defined. |
62
71
|`role_typ`| string | The role claim type, which is typically a URI that provides scheme information about the `role` claim if one is defined. |
63
72
64
-
To process this header, your app must decode the payload and iterate through the `claims` array to find relevant claims. It might be convenient to convert claims into a representation that the app's language framework uses. Here's an example of this process in C# that constructs a [`ClaimsPrincipal`](/dotnet/api/system.security.claims.claimsprincipal) type for the app to use:
73
+
For convenience, you can convert claims into a representation that the app's language framework uses. The following C# example constructs a [`ClaimsPrincipal`](/dotnet/api/system.security.claims.claimsprincipal) type for the app to use.
65
74
66
75
```csharp
67
76
usingSystem;
@@ -106,17 +115,12 @@ public static class ClaimsPrincipalParser
@@ -127,19 +131,24 @@ public static class ClaimsPrincipalParser
127
131
128
132
### Framework-specific alternatives
129
133
130
-
For ASP.NET 4.6 apps, App Service populates [`ClaimsPrincipal.Current`](/dotnet/api/system.security.claims.claimsprincipal.current) with the authenticated user's claims. You can follow the standard .NET code pattern, including the [`Authorize`] attribute. Similarly, for PHP apps, App Service populates the `_SERVER['REMOTE_USER']` variable. For Java apps, the claims are [accessible from the Tomcat servlet](configure-language-java-security.md#authenticate-users-easy-auth).
134
+
- For ASP.NET 4.6 apps, App Service populates [`ClaimsPrincipal.Current`](/dotnet/api/system.security.claims.claimsprincipal.current) with the authenticated user's claims. You can follow the standard .NET code pattern, including the `[Authorize]` attribute.
135
+
136
+
`ClaimsPrincipal.Current` isn't populated for .NET code in [Azure Functions](../azure-functions/functions-overview.md), but you can still find the user claims in the request headers, or get the `ClaimsPrincipal` object from the request context or through a binding parameter. For more information, see [Work with client identities in Azure Functions](../azure-functions/functions-bindings-http-webhook-trigger.md#working-with-client-identities).
137
+
138
+
- For PHP apps, App Service similarly populates the `_SERVER['REMOTE_USER']` variable.
131
139
132
-
For [Azure Functions](../azure-functions/functions-overview.md), `ClaimsPrincipal.Current` isn't populated for .NET code, but you can still find the user claims in the request headers, or get the `ClaimsPrincipal` object from the request context or even through a binding parameter. For more information, see [Work with client identities in Azure Functions](../azure-functions/functions-bindings-http-webhook-trigger.md#working-with-client-identities).
140
+
- For Java apps, the claims are accessible from the [Tomcat servlet](configure-language-java-security.md?pivots=java-tomcat#authenticate-users-easy-auth).
133
141
134
-
For .NET Core, [`Microsoft.Identity.Web`](https://www.nuget.org/packages/Microsoft.Identity.Web/) supports populating the current user with App Service authentication. To learn more, review the [Microsoft.Identity.Web wiki](https://github.com/AzureAD/microsoft-identity-web/wiki/1.2.0#integration-with-azure-app-services-authentication-of-web-apps-running-with-microsoftidentityweb) or see it demonstrated in [this tutorial for a web app accessing Microsoft Graph](./scenario-secure-app-access-microsoft-graph-as-user.md?tabs=command-line#install-client-library-packages).
142
+
-For .NET Core, [`Microsoft.Identity.Web`](https://www.nuget.org/packages/Microsoft.Identity.Web/) supports populating the current user with App Service authentication. For more information, see [Integration with Azure App Services authentication of web apps running with Microsoft.Identity.Web](https://github.com/AzureAD/microsoft-identity-web/wiki/1.2.0#integration-with-azure-app-services-authentication-of-web-apps-running-with-microsoftidentityweb). For a demonstration of a web app accessing Microsoft Graph, see [Tutorial: Access Microsoft Graph from a secured .NET app as the user](scenario-secure-app-access-microsoft-graph-as-user.md).
135
143
136
144
> [!NOTE]
137
-
> For claims mapping to work, you must enable the [token store](overview-authentication-authorization.md#token-store).
145
+
> For claims mapping to work, you must enable the [token store](overview-authentication-authorization.md#token-store) for your app.
138
146
139
147
## Access user claims by using the API
140
148
141
-
If the [token store](overview-authentication-authorization.md#token-store) is enabled for your app, you can also obtain other details on the authenticated user by calling `/.auth/me`.
149
+
If the [token store](overview-authentication-authorization.md#token-store) is enabled for your app, you can also call `/.auth/me` to obtain other details on the authenticated user.
142
150
143
151
## Related content
144
152
153
+
-[Authentication and authorization in Azure App Service and Azure Functions](overview-authentication-authorization.md)
145
154
-[Tutorial: Authenticate and authorize users end to end](tutorial-auth-aad.md)
0 commit comments