我在AzureAdd AppRegistrations中注册了我的应用程序,并在我的应用程序的AppRoles
中添加了manifest
,即管理员角色。在Azure企业应用程序菜单中,我添加了一个用户,并为其分配了管理员角色,可以选择该角色。
在我的应用程序的Startup
类中,我添加了AddAuthorization部分并定义了策略RequireRole("Admin")
。
我为控制器类使用了[Authorize(Roles = "Admin")]
,并在导航栏局部视图中添加了((await AuthorizationService.AuthorizeAsync(User, "Admin")).Succeeded)
。
但是,当我调试时,找不到{http://schemas.microsoft.com/ws/2008/06/identity/claims/role: Admin}
条目,并且User.IsInRole("Admin")
返回false。但是,用户凭据是正确的。据我所知,我已经完成了所有步骤。我唯一能想到的是我的azure订阅不允许添加组,但是我看不到如何将其与我设置的任何内容相关联。我不使用任何群组,仅使用个人用户。我在这里想念什么?为什么我看不到用户角色?
清单:
{
"allowedMemberTypes": [
"User"
],
"description": "Admin's have access to everything.",
"displayName": "Admin",
"id": "d1c2ade8-98f8-45fd-ba4b-6d06b947c66f",
"isEnabled": true,
"lang": null,
"origin": "Application",
"value": "Admin"
},
"groupMembershipClaims": "SecurityGroup",
Startup.cs
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
.AddAzureAD(options => Configuration.Bind("AzureAd", options));
services.AddAuthorization(options =>
{
options.AddPolicy("Admin", policy => policy.RequireRole("Admin"));
options.AddPolicy("Packager", policy => policy.RequireRole("Packager"));
});
查看:
@if ((await AuthorizationService.AuthorizeAsync(User, "Admin")).Succeeded)
{
<li><a asp-area="" asp-controller="Home" asp-action="Admin">Admin</a></li>
}
http://schemas.microsoft.com/ws/2008/06/identity/claims/role是旧的SAML声明类型格式。对于OIDC,Azure AD将发布一个或多个roles claims。
要解决此问题,请确保在服务配置过程中使用以下代码:
JwtSecurityTokenHandler.DefaultMapInboundClaims = false;
services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.TokenValidationParameters.RoleClaimType = "roles";
});