【问题标题】:Blazor AuthorizeView - Is there any way to ignore authorization at the application level?Blazor AuthorizeView - 有什么方法可以忽略应用程序级别的授权吗?
【发布时间】:2022-11-19 01:28:18
【问题描述】:

我目前正在尝试编写一个 Blazor 组件库以跨不同的 Blazor 应用程序使用,我希望能够切换是否存在安全性。

因此,本质上是编写一个 Blazor 组件,如果您愿意,则不需要授权,但如果您确实需要授权,则需要将组件所需的任何角色分配给 AuthenticationState 中的 ClaimsIdentity。

<AuthorizeView Roles="SomeRole">
    <Authorized>
    ...Authorized stuff
    </Authorized>
    <NotAuthorized>
    ...Not authorized stuff
    </NotAuthorized>
</AuthorizeView>

因此,从本质上讲,我是否可以指示组件完全忽略如上所述向用户授权角色SomeRole 的要求,并将当前会话视为已授权?理想情况下,这将通过配置设置完成。

我目前的想法是,这只能使用组件本身内的 @if 语句来检查设置并根据发现的内容应用不同的前端代码来实现。

【问题讨论】:

    标签: blazor authorization


    【解决方案1】:

    尝试将 AuthorizeView 视图组件构建到您的组件中是一种非常笨拙且容易出错的方法。它本身就是一个组件。要实现安全性,您需要退后一步并在AuthorizeView 中实现逻辑。

    让我向您展示一个示例,我用它来演示您可以构建到库组件中的授权类型。这个基于用户传递定义的策略在列表行上隐藏/显示按钮,例如编辑按钮。

    public class UIAuthorizeButton : UIButton
    {
        [CascadingParameter] public Task<AuthenticationState> AuthTask { get; set;     
        [Parameter] public string Policy { get; set; } = String.Empty;
        [Parameter] public object? AuthFields { get; set; } = null;
    } = default!;
        [Inject] protected IAuthorizationService authorizationService { get; set; } =default!;
    
        protected async override Task OnParametersSetAsync()
        {
            if (AuthTask is null)
                throw new Exception($"{this.GetType().FullName} must have access to cascading Paramater {nameof(AuthTask)}");
    
            await this.CheckPolicy();
        }
    
        protected virtual async ValueTask CheckPolicy()
        {
            var state = await AuthTask!;
            var result = await this.authorizationService.AuthorizeAsync(state.User, AuthFields, Policy);
            // code to hide the component if fails
        }
    }
    

    按钮的东西并不重要。该组件使用策略并与IAuthorizationService 交互以验证当前用户是否通过了策略。

    在这个例子中,AuthFields 是一个简单的对象,它包含来自记录中 OwnerId 字段的 Guid。定义了一个自定义策略,用于检查提供的 ID 与 ClaimsPrincipal 中通过 state.User 提供的用户 ID。

    您可以在此处查看正在运行的按钮:https://blazr-demo.azurewebsites.net/weatherforecast/list。您可以在顶部栏中选择登录的用户。

    请注意,提供所有支持这项工作的基础设施远远超出了 StackOverflow 答案的范围!

    这有多大用处以及您可以实现多少取决于您在授权以及定义和构建授权策略方面的知识水平。

    以下是您可能会发现有用的一些资源。

    https://learn.microsoft.com/en-us/archive/msdn-magazine/2017/october/cutting-edge-policy-based-authorization-in-asp-net-core

    https://learn.microsoft.com/en-us/dotnet/framework/wcf/extending/custom-authorization

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      • 2023-01-07
      • 2011-12-13
      相关资源
      最近更新 更多