【问题标题】:perform authorization check in code behind在后面的代码中执行授权检查
【发布时间】:2020-02-29 23:36:40
【问题描述】:

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

 <AuthorizeView Policy="CanReadNamePolicy">
     <Authorized Context="test">
        <inputText @Bind-Value="@Name"/>
     </Authorized>
 </AuthorizeView>

但问题是我必须为每个策略重复这个问题,如果同一个用户在多个策略中怎么办

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

所以我应该有这样的东西

 if ((await Authorize("PolicyName")).Succeeded)
 {
    ReadOnlyAttr = "readonly";
 }

如果可能的话,任何想法都可以在后面的代码中执行授权检查

【问题讨论】:

    标签: c# asp.net-core blazor


    【解决方案1】:

    这里有一个代码 sn-p 你怎么做:

    如果应用需要检查授权规则作为程序逻辑的一部分,请使用 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.
        }
    }
    }
    

    注意:

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

    【讨论】:

    • 谢谢,如果我使用一个策略评估多个需求,我如何使用单个 根据需求更改我的文本框的属性
    • 您要更改单个文本框还是多个文本框?您是要进行一种类型的更改还是仅进行一种更改?您应该知道,如果一个策略有多个要求,所有这些都应该成功,以便授权服务返回 Succeeded == true。也许最好定义多个策略和多个授权处理程序,并使用适当的策略和处理程序调用 AuthorizationService.AuthorizeAsync,然后根据策略的评估设置文本框的属性。跨度>
    猜你喜欢
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多