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中