在 Blazor 中配置基于策略的授权
Configuring Policy-based Authorization in Blazor
我正在尝试在 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.cs
在 ConfigureServices 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();
}
}
我用这样的东西...
services.AddAuthorizationCore(options => options.ConfigurePolicies());
public static AuthorizationOptions ConfigurePolicies(this AuthorizationOptions options)
{
options.AddPolicy(Policies.IsAdmin, policy => policy.RequireRole("SuperAdmin"));
}
注意策略是在共享库中定义的,因此它们可以在客户端和服务器中使用
我正在尝试在 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.cs
在 ConfigureServices 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();
}
}
我用这样的东西...
services.AddAuthorizationCore(options => options.ConfigurePolicies());
public static AuthorizationOptions ConfigurePolicies(this AuthorizationOptions options)
{
options.AddPolicy(Policies.IsAdmin, policy => policy.RequireRole("SuperAdmin"));
}
注意策略是在共享库中定义的,因此它们可以在客户端和服务器中使用