我遇到了一个需要自定义身份角色系统的场景。在这里,我创建了另一个名为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中自定义身份验证属性?**
1条答案
按热度按时间ckx4rj1h1#
您应该为它编写一个自定义授权策略。这是你可以做到的:
首先,您应该定义一个自定义的
Requirement
和Handler
。在处理程序中,您可以访问登录用户的信息,例如其声明和角色等:然后将它们介绍给您的客户端应用程序,如下所示:
这个新的自定义策略称为
UserCanSeeProjectPolicy
。现在,您可以使用@attribute [Authorize(Policy = "UserCanSeeProjectPolicy")]
在页面顶部使用它,或者您可以在AuthorizeView
中使用它: