无法使 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 以上)