繁体   English   中英

基于声明的授权以及在何处添加用户可以执行的操作

[英]Claims-based authorization and where to add what the user can do

我刚刚使用基于声明的授权实现了 web api。 用户可以登录系统,然后根据用户可以执行的操作从数据库中提取一组声明并添加到 httpContext.User.Identity。

在 Startup.cs 中注册策略后,使用以下内容:

services.AddAuthorization(options =>
{
    options.AddPolicy(PoliciesDefinitions.RequiresVehicleList, policy => policy.RequireClaim(Permissions.VehiclesList.ToString()));

    ...               
});

我可以在要授权的控制器方法上使用 Authorize 属性,例如:

Authorize(Policy=PoliciesDefinitions.RequiresDriversList)]
[HttpGet]
public ActionResult Get() { ... }

这工作正常,但今天我更彻底地阅读了微软文档,我在基于声明的授权文档中遇到了这个声明:

声明是一个名称值对,表示主题是什么,而不是主题可以做什么

目前,我正在做 microsfot 建议不要做的事情。 我正在将用户可以做的事情(权限)添加到身份中。 所以,这让我想,我做错了吗? 如果答案是肯定的,您将在哪里存储用户权限以及授权如何工作?

这允许 KVP 和多个值。

// with Razor, you did not specific if it was core 2, 3.1 or Razor

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();
    services.AddRazorPages();

    services.AddAuthorization(options =>
    {
        options.AddPolicy("Vendors", policy =>
                          policy.RequireClaim("Type.Tykt.org", "Dealer", "Driver", "WholeSaler", "Asset", "Repair"));
    });
}

选项 2:

还有一个claims集合,您可以在用户成功登录后添加它。

var user = new User {
  Email = "xyz@tykt.org",
  Name =  "xyz"
}

user.Claims.Add(new IdentityUserClaim<string> 
{ 
    ClaimType="your-type",   // your key
    ClaimValue="your-value"  // your value
});

await userManager.CreateAsync(user);

更新参考 MSDN

如果我理解这个问题,那么您对如何存储检索确实是您的选择,那么您的问题就是索赔的价值。

通常,映射和验证发生在PermissionHandler: IAuthorizationHandler或通用方法MinimumAgeHandler: AuthorizationHandler<MinimumAgeRequirement>中。 其中,加载值,并处理特定权限的要求验证,例如最小年龄,但实际声明(您在说明什么/ min age policy值通常在数据库中,如 DOB= 1/1/1990 ) 与Principal object 一起旅行。 现在,您选择在哪里检索索赔的价值取决于您

在下面的 function 中,他从 Context 中获取 Key 的值,然后进行验证

public class MinimumAgeHandler : AuthorizationHandler<MinimumAgeRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                   MinimumAgeRequirement requirement)
    {
        if (!context.User.HasClaim(c => c.Type == ClaimTypes.DateOfBirth &&
                                        c.Issuer == "http://contoso.com"))
        {
            return Task.CompletedTask;
        }

        var dateOfBirth = Convert.ToDateTime(
            // He gets the value on the server-side from any store or 3rd party relayer
            context.User.FindFirst(c => c.Type == ClaimTypes.DateOfBirth && 
                                        c.Issuer == "http://contoso.com").Value);

        int calculatedAge = DateTime.Today.Year - dateOfBirth.Year;
        if (dateOfBirth > DateTime.Today.AddYears(-calculatedAge))
        {
            calculatedAge--;
        }

        if (calculatedAge >= requirement.MinimumAge)
        {
            context.Succeed(requirement);
        }

        return Task.CompletedTask;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM