我正試圖為幾個應用程式制作一個共享布局。這些應用程式是Blazor服務器端的應用程式。這個布局有一個小選單,可以通過appsettings檔案進行配置。其中一個要求是,我們能夠根據appsettings中的活動目錄組串列來顯示或隱藏某些選單項。下面是一個JSON設定的例子。
{<
"MenuItemName":"受保護選單項",
"AllowedGroups"。 [" Administrator"。 "SpecialGroup", "SpecialGroup2"]/span>
}
我相信我們需要使用<AuthorizeView>標簽和/或頁面上的[Authorized]屬性,以確保使用不能導航到該頁面。
實際上我將如何動態地填寫這些標簽?例如,以 Microsoft 檔案中的以下示例為例(https://docs.microsoft.com/en-us/aspnet/core/blazor/security/?view=aspnetcore-5.0#authorize-attribute-1)。我將如何用我的 Appsettings.json 中的設定來替換 Roles="admin, superuser "呢?
<AuthorizeView Roles="admin, superuser" >
<p>只有當你是管理員或超級用戶時才能看到這個。</p>
</AuthorizeView>/span>
在另一個使用[Authorized]屬性的例子中,我如何從appsetings中動態地更新Roles = "admin, superuser "部分?
@page "/"
@attribute [Authorize(Roles = "admin, superuser") ]
<p>你可以只看到這個,如果你是'admin'或'superuser'角色.</p>。
uj5u.com熱心網友回復:
屬性在build time時被嵌入到匯編中。一旦專案/DLL被構建,你就不能再cannot改變這個值。
您需要執行運行時授權。由于你試圖檢查角色,所以注入配置并檢查用戶是否擁有任何角色:
你需要執行運行時授權。
@inject IConfiguration Configuration
var isAllowed = Configuration.GetSection("AllowedGroups"/span>)
.Get<string[]>()
.Any(group => user.IsInRole(group) )。
進一步的資訊
uj5u.com熱心網友回復:
你可以設定一個策略來做這件事。
這只是從appsettings.json中的"AllowedGroups"讀取一個字串陣列,但它演示了基本原理。
public class HasRolesFromConfigRequirement : IAuthorizationRequirement
{
internal string[] allowedGroups;
public HasRolesFromConfigRequirement(>string[] ? allowedGroups) => this.allowedGroups = allowedGroups;
}
public class HasRolesFromConfigHandler 。AuthorizationHandler<HasRolesFromConfigRequirement>
{
protected override Task HandleRequirementAsync()
AuthorizationHandlerContext背景關系。
HasRolesFromConfigRequirement要求)。
{
var rolesRequired = requirement.allowedGroups;
if (roleRequired is null)
{
背景關系.失敗()。
}
else { context.Fail(; }
{
var hasRequiredRole = rolesRequired.Where(role => context.User.IsInRole(role)).Any()。
if(hasRequiredRole)
{
context.Succeed(requirement);
}
else { context.Succeed(requirement); }
{
context.Fail();
}
}
return Task.CompletedTask。
}
public static class AuthorizationOptionsPolicyExtensions
{
public static void AddPolicies(thisIServiceCollection services, IConfiguration配置)。
{
services.AddScoped<IAuthorizationHandler, HasRolesFromConfigHandler>()。
services.AddAuthorizationCore(options => options.ConfigurePolicies(configuration))。
}
public static AuthorizationOptions ConfigurePolicies(this AuthorizationOptions options。IConfiguration配置)。
{
var localConfiguration = configuration.Get<LocalConfiguration>()。
options.AddPolicy("HasARequiredRole", policy => policy.Requirements.Add(new HasRolesFromConfigRequirement(localConfiguration.AllowedGroups))。
return options;
}
<AuthorizeView Policy="HasARequiredRole"/span>>
<div>
有一個必要的角色
</div>有必要的角色。
</AuthorizeView>/span>
@page "/fetchdata"/span>
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@using DynamicRolesPolicy.Shared
@attribute [Authorize(Policy = "HasARequiredRole"/span>)]
@inject HttpClient Http
<PageTitle>天氣預報</PageTitle>
...
A .net6(rc1) repo.
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/311757.html
標籤:
