在 Blazor 中配置基于策略的授权

Posted

技术标签:

【中文标题】在 Blazor 中配置基于策略的授权【英文标题】:Configuring Policy-based Authorization in Blazor 【发布时间】:2021-09-17 12:29:04 【问题描述】:

我正在尝试在 blazor 服务器端实现基于策略的授权。所以我在 Blazor 项目中创建了一个名为 Policy 的文件夹。在该文件夹中包含一个名为 Policies.cs 的文件。实现该文件的内容后,我转到我的Startup.cs 文件并添加services.AddAuthorization() 用于共享策略。这样做之后,在我的Index.razor 文件中,我在需要满足某些条件的地方创建了它,以便根据具有特定角色的用户获得特定视图。如果我以普通用户身份登录,BasicUser 那么它将显示它应该显示的内容。 但是,当我以管理员身份登录 SuperAdmin 时,它将同时显示 IsUserPolicy 和 IsAdmin 策略视图。我不明白为什么它显示两个而不是一个。

Index.razor:

@page "/"
@inject AuthenticationStateProvider GetAuthenticationStateAsync


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

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

Startup.csConfigureServices method

..... 

   services.AddAuthorization(options =>
            
                options.AddPolicy(Policy.Policies.IsAdmin, Policy.Policies.IsAdminPolicy());
                options.AddPolicy(Policy.Policies.IsUser, Policy.Policies.IsUserPolicy());
            );

Policies.cs:

public class Policies
    
        public const string IsAdmin = "IsAdmin";
        public const string IsUser = "IsUser";

        public static AuthorizationPolicy IsAdminPolicy()
        
            return new AuthorizationPolicyBuilder().RequireAuthenticatedUser()
                                                   .RequireRole("Admin")
                                                   .Build();
        

        public static AuthorizationPolicy IsUserPolicy()
        
            return new AuthorizationPolicyBuilder().RequireAuthenticatedUser()
                                                   .RequireRole("Basic")
                                                   .Build();
        
    

【问题讨论】:

【参考方案1】:

我用这样的东西...

services.AddAuthorizationCore(options => options.ConfigurePolicies());
public static AuthorizationOptions ConfigurePolicies(this AuthorizationOptions options)

    options.AddPolicy(Policies.IsAdmin, policy => policy.RequireRole("SuperAdmin"));

A repo with policies

请注意,策略是在共享库中定义的,因此它们可以在客户端和服务器中使用

【讨论】:

所以基本上我应该将 IsAdmin 和 IsUser 分开在其自己的单独类中,并将这些策略放在共享文件夹下? ConfigurePolicies() 是您创建的,因为我没有看到 AddAuthorizationCore 内置? @NoviceCoder 是的,它是一个扩展方法,应该放在公共静态类中......

以上是关于在 Blazor 中配置基于策略的授权的主要内容,如果未能解决你的问题,请参考以下文章

为 Blazor 授权动态添加策略声明

Blazor WebAssembly+Duende.IdentityServer+EF Core认证授权企业级实战

Blazor WASM+Duende.IdentityServer+EF Core认证授权企业级实战

Blazor WASM+Duende.IdentityServer+EF Core认证授权企业级实战

Blazor WebAssembly身份认证与授权

Blazor WebAssembly身份认证与授权