【问题标题】:Custom Authorization (Restriction)自定义授权(限制)
【发布时间】:2021-04-09 10:12:00
【问题描述】:

我想创建一个接受BranchIdStaffIdRoleId 的自定义授权。仅允许员工在登录应用程序时仅查看他的分支机构,因为branchId 是添加的员工网址的一部分。

我设法从url获取id并传递给字符串,但我不知道如何使用这个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);
        }
    }
}

【问题讨论】:

  • 您有两个选项可以在请求中包含用户数据,第一个选项如果您使用的是普通 ASP.NET(在您的应用程序中有session,用户成功登录后使用会话存储用户数据)。其次,如果您使用 API,您可以使用JWT(Json Web 令牌)并将其传递给前端,因此在每个请求中,您都拥有基于它授权和验证用户的令牌(您可以在里面声明令牌,例如 branchID 等)
  • 我使用的是 ASP.NET 用户在满足所有要求之前不允许成功登录。

标签: c# asp.net .net asp.net-mvc asp.net-core


【解决方案1】:

您可以将用户的分支 id 添加为声明,然后将其与您从 URL 获取的分支 id 进行检查。

您可以在 GenerateUserIdentityAsync 函数中添加用户的分支 id 作为声明

// 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;

【讨论】:

  • 这是答案还是评论?
  • 我的数据库中已有用户我不想添加自定义用户
  • 我们没有向数据库添加自定义用户。我们只是向本金添加索赔。这既不会改变数据库结构,也不会改变数据库数据。
【解决方案2】:

如果您使用身份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;
    }
}

【讨论】:

    猜你喜欢
    • 2013-10-31
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    相关资源
    最近更新 更多