设为首页 加入收藏

TOP

asp.net core系列 50 Identity 授权(中)(二)
2019-09-17 19:08:14 】 浏览:100
Tags:asp.net core 系列 Identity 授权
k; } }

     上面代码是当前用户主休是否有一个由已知的受信任颁发者(Issuer)颁发的出生日期声明(ClaimTypes.DateOfBirth)。当前用户缺少声明时,无法进行授权,这种情况下会返回已完成的任务。如果存在声明时,会计算用户的年龄。 如果用户满足此要求所定义的最低年龄,则可以认为授权成功。 授权成功后,会调用 context.Succeed,使用满足的要求作为其唯一参数。

    

  (5) 处理程序注入到服务集合,采用单例

    services.AddSingleton<IAuthorizationHandler, MinimumAgeHandler>();

    在UserClaim用户声明表中,保存一条符合该策略授权的数据,当启动程序,访问AlcoholPurchase资源时,进入授权处理程序MinimumAgeHandler中, 执行context.Succeed(requirement)后, 授权成功。

    

  

  1.5.1 多个需求使用一个处理程序

     下面是多个需求(TRequirement)使用一个处理程序,Handler实现IAuthorizationHandler接口,下面示例是一个对多关系的权限处理程序,可以在其中处理三种不同类型的需求:

public class PermissionHandler : IAuthorizationHandler
{
    public Task HandleAsync(AuthorizationHandlerContext context)
    {
         //获取策略中的多个需求,返回IEnumerable<IAuthorizationRequirement>类型
        var pendingRequirements = context.PendingRequirements.ToList();
         
        foreach (var requirement in pendingRequirements)
        {
            //读取授权
            if (requirement is ReadPermission)
            {
                if (IsOwner(context.User, context.Resource) ||
                    IsSponsor(context.User, context.Resource))
                {
                    context.Succeed(requirement);
                }
            }
            //编辑和删除授权
            else if (requirement is EditPermission ||
                     requirement is DeletePermission)
            {
                if (IsOwner(context.User, context.Resource))
                {
                    context.Succeed(requirement);
                }
            }
        }

        //TODO: Use the following if targeting a version of
        //.NET Framework older than 4.6:
        //      return Task.FromResult(0);
        return Task.CompletedTask;
    }

     具体详细代码,查看官方示例, Github

  

  1.5.2 处理程序应返回什么? (有三种返回)

                   (1) 处理程序通过调用 context.Succeed(IAuthorizationRequirement requirement) 并传递已成功验证的要求来表示成功。

                   (2) 处理程序通常不需要处理失败(显示加context.Fail()),因为同一要求的其他处理程序(1.5.3)可能会成功。

                   (3) 若要保证授权失败,即使其它要求处理程序会成功,也会失败,请调用context.Fail();   

    

  1.5.3  一个需求应用在多个处理程序

     这里授权处理正好与15.1相反,下面这个示例是门禁卡授权策略需求, 你公司的门禁卡丢在家中,去公司后要求前台给个临时门禁卡来开门。这种情况下,只有一个需求,但有多个处理程序,每个处理程序针对单个要求进行检查。

     //策略授权需求,这里没有参数需求, 参数是硬编码在处理程序中
     public class BuildingEntryRequirement : IAuthorizationRequirement
      {
      }
//门禁卡处理程序
public class BadgeEntryHandler : AuthorizationHandler<BuildingEntryRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                   BuildingEntryRequirement requirement)
    {
            //需求参数硬编码 BadgeId 
        if (context.User.HasClaim(c => c.Type == "BadgeId" &&
                                       c.Issuer == "http://microsoftsecurity"))
        {
            context.Succeed(requirement);
        }

        //TODO: Use the following if targeting a version of
        //.NET Framework older than 4.6:
        //      return Task.FromResult(0);
        return Task.CompletedTask;
    }
}
//临时门禁卡处理程序
public class TemporaryStickerHandler : AuthorizationHandler<BuildingEntryRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, 
                                                   BuildingEntryRequirement requirement)
    {
        //需求参数硬编码 TemporaryBadgeId
        if (context.User.HasClaim(c => c.Type == "T
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇[开源]Dapper Repository 一种实.. 下一篇asp.net core系列 52 Identity 其..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目