【问题标题】:Blazor AuthorizeView: How to use Custom Authorization FilterBlazor AuthorizeView:如何使用自定义授权筛选器
【发布时间】:2022-03-11 06:00:45
【问题描述】:

我正在使用 Blazor 样板中的代码:(BlazorBoilerPlate GitHub)

@using Microsoft.AspNetCore.Components
@inject NavigationManager navigationManager
@inject AuthenticationStateProvider authStateProvider

<AuthorizeView Context="AuthorizeContext">
<Authorized>
    <MatTooltip Tooltip="Logout">
        <MatIconButton Icon="exit_to_app" RefBack="@context" OnClick="LogoutClick"></MatIconButton>
    </MatTooltip>
</Authorized>
<NotAuthorized>
    <MatTooltip Tooltip="Login">
        <MatIconButton Icon="account_box" RefBack="@context" Link="/account/login"></MatIconButton>
    </MatTooltip>
</NotAuthorized>

@code {
     async Task LogoutClick()
     {
          await ((IdentityAuthenticationStateProvider)authStateProvider).Logout();
     navigationManager.NavigateTo("/account/login");
     }
}

“AuthorizeContext”从何而来?依赖注入?如何在此处使用我自己的自定义授权过滤器。

只是寻找任何人都知道的关于这个特定论点的猜测或信息。

这是我的自定义 AuthorizationFilter,我不知道如何在 blazor razor 文件中使用它。

namespace BlazorBoilerplate.Shared.AuthorizationDefinitions

{ 公共类 OfficeAuthorize : IAuthorizationFilter { 私有只读字符串_scenario;

    public OfficeAuthorize(string scenario)
    {
        _scenario = scenario;
    }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        //context.HttpContext.Request.Query
        //custom validation rule
        if (_scenario == "OfficeAssignment")
        {
            context.Result = new ForbidResult();
        }
    }
}

public class OfficeAuthorizeAttribute : TypeFilterAttribute
{
    public OfficeAuthorizeAttribute(int input) : base(typeof(OfficeAuthorize))
    {
        Arguments = new object[] { input };
    }
}

}

【问题讨论】:

  • 在VS中悬停上下文,你会看到:“指定所有子内容表达式的参数名称”。它没有注入到 AuthorizeView 组件中,它是您要为其子组件提供的组件上下文的名称。如果它与另一个上下文(可能是 EditForm)发生冲突,只需要给它一个名称,默认名称是“context”。
  • 我不知道您到底要做什么,但 AuthorizeView 可以在 Roles 参数中采用逗号分隔的角色列表,或在 Policy 参数中采用策略名称。跨度>

标签: c# razor authorization blazor blazor-boilerplate


【解决方案1】:

您可以使用自定义组件包装AuthorizeView 组件。这大致基于框架代码。

public class CustomAuthorizationView : AuthorizeView
{
    private AuthenticationState currentAuthenticationState;
    private bool isAuthorized;

    [Inject]
    private AuthenticationStateProvider AuthenticationStateProvider { get; set; }

    [CascadingParameter] 
    private Task<AuthenticationState> AuthenticationStateTask { get; set; }

    protected override void BuildRenderTree(RenderTreeBuilder builder)
    {
        if (currentAuthenticationState == null)
        {
            builder.AddContent(0, Authorizing);
        }
        else if (isAuthorized)
        {
            var authorizedContent = Authorized ?? ChildContent;
            builder.AddContent(1, authorizedContent?.Invoke(currentAuthenticationState));
        }
        else
        {
            builder.AddContent(2, NotAuthorized?.Invoke(currentAuthenticationState));
        }
    }

    protected override async Task OnParametersSetAsync()
    {           
        var user = (await authenticationStateProvider.GetAuthenticationStateAsync()).User;
        currentAuthenticationState = await AuthenticationStateTask;
        isAuthorized = //authorization logic
    }
}

【讨论】:

    猜你喜欢
    • 2021-05-14
    • 2020-09-09
    • 2021-06-02
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    相关资源
    最近更新 更多