无法使 Blazor WASM AAD 应用程序角色正常工作
Can't Get Blazor WASM AAD App Roles To Work
所以我按照 Microsoft 文档开始了:
Secure an ASP.NET Core Blazor WebAssembly hosted app with Azure Active Directory
Azure AD Groups, Administrative Roles, and user-defined roles
在 Azure 方面似乎设置得很好:
这很好用:
@page "/clients"
@inject NavigationManager navigationManager
@inject HttpClient Http
@inject AppData appData
@inject AuthenticationStateProvider AuthenticationStateProvider
@attribute [Authorize]
我打印了声明以查看发生了什么:
protected async override Task OnInitializedAsync()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
foreach (var claim in user.Claims)
{
System.Diagnostics.Debug.WriteLine(claim.Type + ":" + claim.ValueType + ":" + claim.Value);
}
}
这是打印的行之一:
roles:http://www.w3.org/2001/XMLSchema#string:["Admin"]
所以我可以看到我在 Azure 上的应用程序清单中添加的 appRole 到了这里。 (GUID 隐藏在下方以保护隐私)
"appRoles": [
{
"allowedMemberTypes": [
"User"
],
"description": "Can view everything.",
"displayName": "Global Viewer",
"id": "IDGOESHERE",
"isEnabled": true,
"lang": null,
"origin": "Application",
"value": "GlobalViewer"
},
{
"allowedMemberTypes": [
"User"
],
"description": "Admins can access restricted areas.",
"displayName": "Admin",
"id": "IDGOESHERE",
"isEnabled": true,
"lang": null,
"origin": "Application",
"value": "Admin"
}
],
还将我的用户添加到企业应用程序的管理员角色。
但是在 [Authorize] 属性指令中添加角色使我无法访问页面:(您无权访问此资源。)
attribute [Authorize(Roles = "Admin")]
这在 Program.cs 中(我在“GUIDGOESHERE”中有实际的 GUID)
builder.Services.AddMsalAuthentication(options =>
{
builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication);
options.ProviderOptions.DefaultAccessTokenScopes.Add("GUIDGOESHERE/EmployeesAccess");
options.ProviderOptions.DefaultAccessTokenScopes.Add("GUIDGOESHERE/AdminAccess");
options.UserOptions.RoleClaim = "roles";
});
问题可能出在我的角色声明中。也许问题是这个声明看起来像一个数组?如果是,我该如何解决?
原来 Azure 可能比 ASP.NET Core
稍微领先一点
Azure AD 身份验证默认模板无法立即使用,需要稍作调整。
按照 MS 文档中的步骤操作:Azure AD Groups, Administrative Roles, and user-defined roles
长话短说:
- 它开箱即用,只有一个角色。例如“管理员”
- 问题是有多个角色。
- “角色”声明以字符串“[Admin,User]”形式出现,与“Admin”或“User”不匹配
- CustomUserAccount class 将角色分解为解决问题的字符串[] 对象。
- Microsoft 很好地记录了解决方法。 (link 以上)
所以我按照 Microsoft 文档开始了:
Secure an ASP.NET Core Blazor WebAssembly hosted app with Azure Active Directory
Azure AD Groups, Administrative Roles, and user-defined roles
在 Azure 方面似乎设置得很好:
这很好用:
@page "/clients"
@inject NavigationManager navigationManager
@inject HttpClient Http
@inject AppData appData
@inject AuthenticationStateProvider AuthenticationStateProvider
@attribute [Authorize]
我打印了声明以查看发生了什么:
protected async override Task OnInitializedAsync()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
foreach (var claim in user.Claims)
{
System.Diagnostics.Debug.WriteLine(claim.Type + ":" + claim.ValueType + ":" + claim.Value);
}
}
这是打印的行之一:
roles:http://www.w3.org/2001/XMLSchema#string:["Admin"]
所以我可以看到我在 Azure 上的应用程序清单中添加的 appRole 到了这里。 (GUID 隐藏在下方以保护隐私)
"appRoles": [
{
"allowedMemberTypes": [
"User"
],
"description": "Can view everything.",
"displayName": "Global Viewer",
"id": "IDGOESHERE",
"isEnabled": true,
"lang": null,
"origin": "Application",
"value": "GlobalViewer"
},
{
"allowedMemberTypes": [
"User"
],
"description": "Admins can access restricted areas.",
"displayName": "Admin",
"id": "IDGOESHERE",
"isEnabled": true,
"lang": null,
"origin": "Application",
"value": "Admin"
}
],
还将我的用户添加到企业应用程序的管理员角色。
但是在 [Authorize] 属性指令中添加角色使我无法访问页面:(您无权访问此资源。)
attribute [Authorize(Roles = "Admin")]
这在 Program.cs 中(我在“GUIDGOESHERE”中有实际的 GUID)
builder.Services.AddMsalAuthentication(options =>
{
builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication);
options.ProviderOptions.DefaultAccessTokenScopes.Add("GUIDGOESHERE/EmployeesAccess");
options.ProviderOptions.DefaultAccessTokenScopes.Add("GUIDGOESHERE/AdminAccess");
options.UserOptions.RoleClaim = "roles";
});
问题可能出在我的角色声明中。也许问题是这个声明看起来像一个数组?如果是,我该如何解决?
原来 Azure 可能比 ASP.NET Core
稍微领先一点Azure AD 身份验证默认模板无法立即使用,需要稍作调整。
按照 MS 文档中的步骤操作:Azure AD Groups, Administrative Roles, and user-defined roles
长话短说:
- 它开箱即用,只有一个角色。例如“管理员”
- 问题是有多个角色。
- “角色”声明以字符串“[Admin,User]”形式出现,与“Admin”或“User”不匹配
- CustomUserAccount class 将角色分解为解决问题的字符串[] 对象。
- Microsoft 很好地记录了解决方法。 (link 以上)