Blazor 服务器网站的 AAD 授权

AAD Authorization for Blazor Server Website

我已经将代码的副本推送到以下github repo

我有一个新的 dotnet 6 Blazor 服务器项目,在 VS2022 v17.0.4 中创建

我想控制根据登录到 Azure Active Directory 的用户的声明显示的 Blazor 组件。

我创建了一个具有“管理员”应用角色的应用注册,如下所示:

我有两个用户:

  1. rob.bowman(不是管理员的成员)
  2. aza.rob.bowman(是 Admin 的成员)

为了测试声明,我添加了以下内容以在 Program.cs 文件中创建策略:

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("AdminOnly", policy => policy.RequireClaim("App.Admin"));
});

注意:我也尝试过使用“Admin”声明而不是“App.Admin”

我有以下用于测试的页面:

@page "/testadmin"
<h3>TestAdmin</h3>

<AuthorizeView Policy="AdminOnly">
    <p>You can only see this if you satisfy the "AdminOnly" policy.</p>
</AuthorizeView>

我的问题是,受保护的段落 未显示 ,无论我登录的用户是:

为了帮助诊断,我添加了 this microsoft docs 中的一个页面来展示声明。这确实显示了对 App.Admin

角色的声明

我认为您的方向是正确的。这可能是几件事,但一旦它起作用,你就会很高兴。

  1. 首先,您能否确认您的顶级 .razor 组件中有一个 <CascadingAuthenticationState> 标签?这将确保身份验证状态传递到您的 .razor 组件。这可能不是问题,但会是!

  2. 其次,你能仔细检查一下你的授权政策吗?根据此 https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies?view=aspnetcore-6.0,您的保单要求索赔名称为“App.Admin”。您可能想试试这个(需要一个值为“App.Admin”的 Role 声明):

    {
        options.AddPolicy("AdminOnly", policy => policy.RequireClaim(ClaimTypes.Role, "App.Admin"));
    });
    
    
  3. 最后,我建议在您的 .razor 组件中使用“基于角色”的授权。这将允许 AuthorizationState(在 .razor 中)由用户的 Role 声明确定(App.Admin 与 . 您可以在设置身份验证时使用 options.TokenValidationParameters.RoleClaimType 配置角色声明在 Blazor 应用中。