当前位置:首页 > Web开发 > 正文

authenticationMethod: custom

2024-07-17 Web开发

标签:

一、前言

前几篇文章分享了IdentityServer4暗码模式的根基授权及自界说授权等方法,比出处于改革一个网关处事,用到了IdentityServer4的授权,改革过程中发明对照适合基于Role角色的授权,通过差此外角色来限制用户访谒差此外Api资源,这里我就来分享IdentityServer4基于角色的授权详解。

IdentityServer4 历史文章目录

Asp.Net Core IdentityServer4 中的根基观点

Asp.Net Core 中IdentityServer4 授权中心之应用实战

Asp.Net Core 中IdentityServer4 授权中心之自界说授权模式

Asp.Net Core 中IdentityServer4 授权道理及刷新Token的应用

Asp.Net Core 中IdentityServer4 实战之 Claim详解

没有看过之前的几篇文章,我建议先回过头看看上面那几篇文章再来看本篇文章,不过对付大牛来说就可以跳过了。。。。

二、模拟场景

还是凭据我的文章气势派头套路,实战之前先来模拟下应用场景,无场景的实战都是耍地痞,模拟场景更能让大家投入,同时也是自我学习、思考、总结的结晶之处!!!

对付角色授权大家也不陌生,大家对照熟悉的应该是RBAC的设计,这里就非论述RBAC,有兴趣的可以百度。我们这里简单模拟下角色场景
假如有这么一个数据网关处事处事(下面我统称为数据网关),客户端有三种账号角色(普通用户、打点员用户、超级打点员用户),数据网关针对这三种角色用户分配差此外数据访谒权限,场景图如下:

技术图片

那么这种场景我们会怎么去设计呢?这个场景还算对照简单,角色对照单一,对照固定,对付这种场景很多人可能会考虑到通过Filter过滤器等方法来实现,这固然可以。不过正对这种场景IdentityServer4中自己就撑持角色授权,下面我来给大家分享IdentityServer4的角色授权.

三、角色授权实战 授权流程

撸代码之前我们先整理下IdentityServer4的 角色授权流程图,我简单归纳综合画了下,流程图如下:

技术图片

场景图归纳综合如下:

客户端分为三种核心角色(普通用户、打点员用户、超级打点-老板)用户,三种用户访谒同一个数据网关(API资源)

数据网关(API资源)对这三种用户角色做了访谒限制。

角色授权流程解释如下:

第一步: 差此外用户携带用户暗码等信息访谒授权中心(ids4)测验考试授权

第二步: 授权中心对用户授权通过返回access_token给用户同时声明用户的Role到Claim中。。

第三步: 客户端携带拿到的access_token测验考试请求数据网关(API资源)。

第四步:数据网关收到客户真个第一次请求会到授权中心请求获得验证公钥。

第五步:授权中心返回验证公钥给数据网关并且缓存起来,后面不再到授权中心再次获得验证公钥(只会请求一次,除非重启处事)。

第六步:数据网关(ids4)通过验证网关验证access_token是否验证通过,并且验证请求的客户端用户声明的Role是否和请求的API资源约定的的角色一致。如果一致则通过第步返回给用户端,否则直接拒绝请求.

撸代码

代码继续上面几篇文章的例子的续集,你懂的,就不从零开始撸代码啦(强烈建议没看过上面几篇的先看下上面的目录中的几篇,要不然会一头雾水,大佬跳过)
要使IdentityServer4实现的授权中心撑持角色验证的撑持,我们需要在界说的API资源中添加角色的引入,代码如下:
上几篇文章的授权中心(Jlion.NetCore.Identity.Service)的
代码如下:

/// <summary> /// 资源 /// </summary> /// <returns></returns> public static IEnumerable<ApiResource> GetApiResources() { return new List<ApiResource> { new ApiResource(OAuthConfig.UserApi.ApiName,OAuthConfig.UserApi.ApiName), }; }

插手角色的撑持代码改革如下:

/// <summary> /// 资源 /// </summary> /// <returns></returns> public static IEnumerable<ApiResource> GetApiResources() { return new List<ApiResource> { new ApiResource( OAuthConfig.UserApi.ApiName, OAuthConfig.UserApi.ApiName, new List<string>(){JwtClaimTypes.Role } ), }; }

API资源中添加了角色验证的撑持后,需要在用户登录授权告成后声明Claim用户的Role信息,代码如下:
改革前代码:

public class ResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator { public async Task ValidateAsync(ResourceOwnerPasswordValidationContext context) { try { var userName = context.UserName; var password = context.Password; //验证用户,这么可以到数据库里面验证用户名和暗码是否正确 var claimList = await ValidateUserAsync(userName, password); // 验证账号 context.Result = new GrantValidationResult ( subject: userName, authenticationMethod: "custom", claims: claimList.ToArray() ); } catch (Exception ex) { //验证异常功效 context.Result = new GrantValidationResult() { IsError = true, Error = ex.Message }; } } #region Private Method /// <summary> /// 验证用户 /// </summary> /// <param name="loginName"></param> /// <param name="password"></param> /// <returns></returns> private async Task<List<Claim>> ValidateUserAsync(string loginName, string password) { //TODO 这里可以通过用户名和暗码到数据库中去验证是否存在, // 以及角色相关信息,我这里还是使用内存中已经存在的用户和暗码 var user = OAuthMemoryData.GetTestUsers(); if (user == null) throw new Exception("登录掉败,用户名和暗码不正确"); return new List<Claim>() { new Claim(ClaimTypes.Name, $"{loginName}"), new Claim(EnumUserClaim.DisplayName.ToString(),"测试用户"), new Claim(EnumUserClaim.UserId.ToString(),"10001"), new Claim(EnumUserClaim.MerchantId.ToString(),"000100001"), }; } #endregion }

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/27386.html