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.2.1客户端增加访问资源配置

3.2.2自定义策略认证并且注入服务
public class SmithInSomewareRequirement : IAuthorizationRequirement { public SmithInSomewareRequirement() { } } public class SmithInSomewhereHandler : AuthorizationHandler<SmithInSomewareRequirement> { 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.2.3策略授权
将特性加到Controller或者Method中
![]()

浙公网安备 33010602011771号