IdentityServer4 使用Hybird Flow保护Asp.Net Core MVC 客户端


1.使用Hybird Flow保护Asp.Net Core MVC 客户端

并访问被保护资源

刷新Access Token

处理Claim

基于策略的权限

授权端点

重定向端点

Token端点

主要授权方式

OpenID Connect Flows

 OpenId Connect Flows Response Type

 response_type=code id_token

response_type=code token

 response_type=code id_token

 请求格式

 响应格式

2.Claim 角色授权

2.1Idp工程代码配置

(1)TestUser自定义Cliam Role

(2)Identity认证资源配置Role

 (3)Mvc客户端配置可以访问的资源roles

2.2Mvc客户端工程配置

(1)当没有权限时增加跳转页面

(2)增加需要访问的roles资源并且将Cliam的Role和Mvc的Role进行映射

(3)将特性加到Controller或者Method上进行权限验证

3.受保护的Claims

3.基于策略授权(PBAC)

3.1Idp工程配置

(1)给用户增加Claim标识

 (2) 在认证资源、api资源和客户端进行访问配置

 

3.2 Mvc客户端配置

3.1客户端增加访问资源配置

3.2自定义策略认证并且注入服务

    public class SmithInSomewareRequirement : IAuthorizationRequirement
    {
        public SmithInSomewareRequirement()
        {

        }
    }
    public class SmithInSomewhereHandler : AuthorizationHandler
    {
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
            SmithInSomewareRequirement requirement)
        {
            //var filterContext = context.Resource as AuthorizationFilterContext;
            //if (filterContext == null)
            //{
            //    context.Fail();
            //    return Task.CompletedTask;
            //}

            var familyName = context.User.Claims.FirstOrDefault(c => c.Type == JwtClaimTypes.FamilyName)?.Value;
            var location = context.User.Claims.FirstOrDefault(c => c.Type == "location")?.Value;

            if (familyName == "Smith" && location == "somewhere" && context.User.Identity.IsAuthenticated)
            {
                context.Succeed(requirement);
                return Task.CompletedTask;
            }

            context.Fail();
            return Task.CompletedTask;

            // 一个Handler成功,其它的Handler没有失败 => Requirement被满足了
            // 某个Hanlder失败 => 无法满足Requirement
            // 没有成功和失败 => 无法满足Requirement
        }
    }

3.3策略授权

将特性加到Controller或者Method中