.net 如何在Blaozr WASM中实现自定义身份验证属性

7xllpg7q  于 2023-06-25  发布在  .NET
关注(0)|答案(1)|浏览(168)

我遇到了一个需要自定义身份角色系统的场景。在这里,我创建了另一个名为Projects的表,并将其连接到UserRoles表,我的角色是这样的,用户可以在项目中拥有一个角色,这意味着除了用户和角色之外,还有另一个必须检查的键。为此,我在www.example.com Api项目端定制了Authorize属性,如下所示Asp.net Api project side as below

public class AuthAttribute : ActionFilterAttribute
{
    public string[] Roles { get; init; }
    public AuthAttribute(params string[] roles) => Roles = roles;

    public override async Task OnActionExecutionAsync(ActionExecutingContext context,ActionExecutionDelegate next)
    {
        if(!context.HttpContext.User.Identity!.IsAuthenticated)
        {
            context.Result = new UnauthorizedResult();
            return;
        }
        int projectId = int.Parse(context.HttpContext.GetHeaderValue("ProjectId"));
        var userManager = context.HttpContext.RequestServices.GetService<IUserManagerService>();
        int userId = context.HttpContext.User.Identity.GetId();
        foreach(var role in Roles)
        {
            var isHasRole = await userManager!.IsInRolAsync(userId,role,projectId);
            if(isHasRole)
                return;
        }
        context.Result = new ForbidResult();
    }
}

我使用JWT身份验证并从头文件中获取项目名称
我使用JWT声明中的以下模型,将客户端的角色和项目作为一个数组

public class RoleProjectClaimModel
{
    public string Role { get; set; }
    public int ProjectId { get; set; }
}

此外,项目id应该检查,它是本地存储保存

    • 如何在Blazor中自定义身份验证属性?**
ckx4rj1h

ckx4rj1h1#

您应该为它编写一个自定义授权策略。这是你可以做到的:
首先,您应该定义一个自定义的RequirementHandler。在处理程序中,您可以访问登录用户的信息,例如其声明和角色等:

public class UserCanSeeProjectRequirement : IAuthorizationRequirement
{
    public UserCanSeeProjectRequirement() { }

}

public class UserCanSeeProjectHandler : AuthorizationHandler<UserCanSeeProjectRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, 
                                                   UserCanSeeProjectRequirement requirement)
    {
        //claim-based validation
        if (context.User.HasClaim("permission.cansee", "CanSee"))
                context.Succeed(requirement);

        //role-based validation
        if (context.User.IsInRole("admin") || context.User.IsInRole("user"))
                context.Succeed(requirement);

        return Task.CompletedTask;
    }
}

然后将它们介绍给您的客户端应用程序,如下所示:

namespace BlazorWasm.Client
{
    public class Program
    {
        public static async Task Main(string[] args)
        {
            // ...

            services.AddScoped<IAuthorizationHandler, UserCanSeeProjectHandler>();
            services.AddAuthorizationCore(options => {
                options.AddPolicy("UserCanSeeProjectPolicy", policy => policy.Requirements.Add(new UserCanSeeProjectRequirement()));
            });

            // ...
        }
    }
}

这个新的自定义策略称为UserCanSeeProjectPolicy。现在,您可以使用@attribute [Authorize(Policy = "UserCanSeeProjectPolicy")]在页面顶部使用它,或者您可以在AuthorizeView中使用它:

<AuthorizeView Policy="UserCanSeeProjectPolicy">
    <NotAuthorized>
       <h2 class="mt-5">You are not authorized to view this page</h2>
    </NotAuthorized>
    <Authorized>
      <div class="container my-profile">
        --- Place here all the content you want your user to view ----
      </div>
    </Authorized>
</AuthorizeView>

相关问题