自定义授权限制

问题描述

我想创建一个接受 BranchIdStaffIdRoleId自定义授权。由于 branchId添加的员工 URL 的一部分,因此员工只能在登录应用程序时查看其分行。

我设法从 url 获取 id 并传递给 string,但我不知道如何使用此 id 检查当前用户branch id,然后检查以查看员工是否应该在分支机构以及在允许访问之前扮演什么角色。

这是我的例子。我是 .net 的新人。我该怎么做?

protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context,RestrictViewRequirement requirement)
{
    int? branchId = null;     
    if (context.Resource is AuthorizationFilterContext authContext)
    {
        var tmp = authContext.HttpContext.Request.Query["branchId"].ToString();

        if (!string.IsNullOrEmpty(tmp))
        {
            branchId = int.Parse(tmp);
        }
    }
}

解决方法

您可以将用户的分支 ID 添加为 Claim,然后根据您从 URL 获取的分支 ID 进行检查。

您可以在 GenerateUserIdentityAsync 函数中将用户的分支 ID 添加为 Claim

// Add custom user claims here
userIdentity.AddClaim(new Claim("BranchId","XYZ"));
return userIdentity;

现在当你想检查它时,你可以从声明中获取分支 id。 您可以这样取回索赔:

var ci = (ClaimsIdentity)HttpContext.Current.User.Identity;
var branchid = ci.Claims.FirstOrDefault(t => t.Type == "BranchId")?.Value;
,

如果您使用身份 SignInManager 登录,则可以将 UserManager 依赖注入 CustomAuthorizationHandler,然后您可以获得当前登录用户。

public class CustomAuthorizationHandler : AuthorizationHandler<RestrictViewRequirement>
{
    private readonly UserManager<IdentityUser> _userManager;

    public CustomAuthorizationHandler(UserManager<IdentityUser> userManager)
    {
        _userManager = userManager;
    }

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,RestrictViewRequirement requirement)
    {
        var currentUser = _userManager.Users.FirstOrDefault();
        //....
        return Task.CompletedTask;
    }
}