在代码后面执行授权检查

Mar*_*aro 4 c# asp.net-core blazor

在 blazor 页面中,如果用户有特定策略,我想(显示/隐藏/设置为只读/更改样式...等)文本框,以便实现(显示和隐藏)我执行了以下操作:

 <AuthorizeView Policy="CanReadNamePolicy">
     <Authorized Context="test">
        <inputText @Bind-Value="@Name"/>
     </Authorized>
 </AuthorizeView>
Run Code Online (Sandbox Code Playgroud)

但问题是我必须对每个策略重复此操作,如果同一用户位于多个策略中怎么办

所以我想将此逻辑移至后面的代码并使用属性来设置文本框,但我无法找到在后面的代码中进行授权检查的方法

所以我应该有这样的东西

 if ((await Authorize("PolicyName")).Succeeded)
 {
    ReadOnlyAttr = "readonly";
 }
Run Code Online (Sandbox Code Playgroud)

是否有可能在代码后面执行授权检查的任何想法

Isa*_*aac 7

这是一个代码片段,您可以如何做到这一点:

如果应用程序需要检查授权规则作为过程逻辑的一部分,请使用 Task 类型的级联参数来获取用户的 ClaimsPrincipal。任务可以与其他服务(例如 IAuthorizationService)相结合来评估策略。

@inject IAuthorizationService AuthorizationService

<button @onclick="@DoSomething">Do something important</button>

@code {
[CascadingParameter]
private Task<AuthenticationState> authenticationStateTask { get; set; }

private async Task DoSomething()
{
    var user = (await authenticationStateTask).User;

    if ((await AuthorizationService.AuthorizeAsync(user, "CanReadNamePolicy"))
        .Succeeded)
    {
        // Perform an action only available to users satisfying the 
        // 'CanReadNamePolicy' policy.
    }
}
}
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. InputText 组件必须驻留在 EditForm 组件内。
  2. @bind-Value不是@Bind-Value
  3. 一个策略可以评估多个要求...您仍然可以使用 AuthorizeView 来评估单个策略中的多个要求。