我已经设置了一个 Entra 外部 ID 租户并注册了两个应用程序“前端”和“后端”。前端是 Angular 应用程序,后端是 ASP.NET Core 应用程序。
到目前为止,我可以对客户端进行身份验证,并从 Web API 控制器中的声明中读取用户的角色,如下所示:
var user = (HttpContext.User.Identity as ClaimsIdentity);
if(user == null){
return Array.Empty<RolesEnum>();
}
var roles = user.Claims.Where(claim => claim.Type == ClaimTypes.Role)
我为我的用户创建了一个自定义属性,并通过 Microsoft.Graph 设置了它。当我在前端的 ID 令牌中包含自定义属性时,Angular 应用程序将在从 MSAL 库返回的用户对象中找到 ID 令牌。
我在服务器端需要此值,但承载令牌不包含此值,即使我为令牌类型“Access”配置自定义属性也是如此。
我是否理解正确,我的后端应用程序的 Token 配置实际上是用于后端和其他服务之间的通信?
为什么这个自定义属性不在 Access Token 中(是不记名 Token?),即使我这样配置?
我创建了两个 Microsoft Entra ID 应用程序和
BackEnd
和 FrontEnd
:
在
BackEnd
中,我公开了 API 并添加了范围:
在
FrontEnd
中,我授予了API权限,如下所示:
并创建了自定义属性并通过 Microsoft Graph API 分配给用户。
在
FrontEnd
中,在Token配置刀片中添加了自定义属性:
并使用以下参数通过 Postman 生成令牌:
Grant type: Authorization code
Callback URL: https://oauth.pstmn.io/v1/callback
Auth URL: https://login.microsoftonline.com/TenantId/oauth2/v2.0/authorize
Token URL : https://login.microsoftonline.com/TenantId/oauth2/v2.0/token
Client ID : FrontEndClientID
Client Secret : ClientSecret
Scope: api://BackEndClientID/access.app
并且遇到了与您相同的问题,自定义声明显示在 ID 令牌中而不是访问令牌中。
注意:要在访问令牌中显示自定义声明,您需要为应用程序生成令牌。请参阅MsDoc
因此要解决问题,您需要通过传递
BackEnd
应用程序ObjectID来创建扩展:
POST https://graph.microsoft.com/v1.0/applications/BackEndappObjID/extensionProperties
Content-type: application/json
{
"name": "PersonID",
"dataType": "String",
"targetObjects": [
"User"
]
}
将值分配给用户:
PATCH https://graph.microsoft.com/v1.0/users/UPN
Content-type: application/json
{
"extension_XXX_PersonID": "XXX"
}
现在在
BackEnd
应用程序中,配置 选项声明:
我再次生成了令牌,现在 ID 和访问令牌都成功了:
访问令牌:
ID令牌: