免费的网站app软件,海外永久不收费的加速器,wordpress不支持中文标签,沂源手机网站建设公司一、前言上一篇我分享了一篇关于 Asp.Net Core 中IdentityServer4 授权中心之应用实战的文章#xff0c;其中有不少博友给我提了问题#xff0c;其中有一个博友问我的一个场景#xff0c;我给他解答的还不够完美#xff0c;之后我经过自己的学习查阅并阅读了相关源代码其中有不少博友给我提了问题其中有一个博友问我的一个场景我给他解答的还不够完美之后我经过自己的学习查阅并阅读了相关源代码发现 IdentityServer4 可以实现自定义GrantType 授权方式。声明看这篇文章时如果你没有阅读我上一篇 Asp.Net Core 中IdentityServer4 授权中心之应用实战的文章那请先点击下面的链接移步阅读再来看这篇文章会更加清晰感谢支持感谢关注Asp.Net Core 中IdentityServer4 授权中心之应用实战二、场景模拟上篇文章已经把电商系统从单一网关架构升级到多网关架构架构图如下然而上面的授权中心 使用的是密码授权模式但是对于微信小程序、微信公众号商城端使用的授权还不是很合适 微信小程序和微信公众号微商城客户端的场景如下用户访问小程序商城或者微信公众号商城后会到微信服务端获得授权拿到相关的用户openId、unionId、userName 等相关信息再携带openId、unionId、userName等信息访问授权中心网关进行授权如果不存在则自动注册用户如果存在则登录授权成功等操作。那这个场景后我该如何改造授权中心服务网关呢经过研究和探讨我把上面的架构图细化成如下的网关架构图三、授权中心改造升级通过上面的需求场景分析我们目前的授权中心还不满足这种需求故我们可以通过IdentityServer4 自定义授权方式进行改造升级来满足上面的场景需求。经过查看源代码我发现我们可以通过实现IExtensionGrantValidator抽象接口进行自定义授权方式来实现并且实现ValidateAsync 方法 现在我在之前的解决方案授权中心项目中新增WeiXinOpenGrantValidator类代码如下public class WeiXinOpenGrantValidator : IExtensionGrantValidator
{public string GrantType GrantTypeConstants.ResourceWeixinOpen;public async Task ValidateAsync(ExtensionGrantValidationContext context){try{#region 参数获取var openId context.Request.Raw[ParamConstants.OpenId];var unionId context.Request.Raw[ParamConstants.UnionId];var userName context.Request.Raw[ParamConstants.UserName];#endregion#region 通过openId和unionId 参数来进行数据库的相关验证var claimList await ValidateUserAsync(openId, unionId);#endregion#region 授权通过//授权通过返回context.Result new GrantValidationResult(subject: openId,authenticationMethod: custom,claims: claimList.ToArray());#endregion}catch (Exception ex){context.Result new GrantValidationResult(){IsError true,Error ex.Message};}}#region Private Method/// summary/// 验证用户/// /summary/// param nameloginName/param/// param namepassword/param/// returns/returnsprivate async TaskListClaim ValidateUserAsync(string openId, string unionId){//TODO 这里可以通过openId 和unionId 来查询用户信息(数据库查询)//我这里为了方便测试还是直接写测试的openId 相关信息用户var user OAuthMemoryData.GetWeiXinOpenIdTestUsers();if (user null){//注册用户}return new ListClaim(){new Claim(ClaimTypes.Name, ${openId}),};}#endregion}
GrantTypeConstants 代码是静态类,主要用于定义GrantType的自定义授权类型可能后续还有更多的自定义授权方式所以统一放这里面进行管理方便维护代码如下 public static class GrantTypeConstants{/// summary/// GrantType - 微信端授权/// /summarypublic const string ResourceWeixinOpen weixinopen;}
ParamConstants 类主要是定义自定义授权需要的参数代码如下public class ParamConstants
{public const string OpenId openid;public const string UnionId unionid;public const string UserName user_name;
}
好了上面的自定义验证器已经实现了但是还不够我们还需要让客户端支持自定义的授权类型我们打开OAuthMemoryData代码中的GetClients,代码如下public static IEnumerableClient GetClients()
{return new ListClient{new Client(){ClientId OAuthConfig.UserApi.ClientId,AllowedGrantTypes new Liststring(){GrantTypes.ResourceOwnerPassword.FirstOrDefault(),//Resource Owner Password模式GrantTypeConstants.ResourceWeixinOpen,//新增的自定义微信客户端的授权模式},ClientSecrets {new Secret(OAuthConfig.UserApi.Secret.Sha256()) },AllowedScopes {OAuthConfig.UserApi.ApiName},AccessTokenLifetime OAuthConfig.ExpireIn,},};
}
客户端AllowedGrantTypes 配置新增了我刚刚自定义的授权方式GrantTypeConstants.ResourceWeixinOpen, 现在客户端的支持也已经配置好了最后我们需要通过AddExtensionGrantValidator扩展方法把自定义授权验证器注册到DI中代码如下public void ConfigureServices(IServiceCollection services)
{services.AddControllers();#region 数据库存储方式services.AddIdentityServer().AddDeveloperSigningCredential().AddInMemoryApiResources(OAuthMemoryData.GetApiResources())//.AddInMemoryClients(OAuthMemoryData.GetClients()).AddClientStoreClientStore().AddResourceOwnerValidatorResourceOwnerPasswordValidator().AddExtensionGrantValidatorWeiXinOpenGrantValidator();#endregion}
好了简单的授权中心代码升级已经完成我们分别通过命令行运行授权中心和用户业务网关 之前的用户业务网关无需改动任何代码运行图分别如下Jlion.NetCore.Identity.Server 授权中心运行如下Jlion.NetCore.Identity.UserApiServer 用户业务网关运行如下我们现在用postman模拟openId、unionId、userName参数来请求授权中心获得AccessToken请求如下我们再通过postman 携带授权信息访问用户业务网关数据结果图如下好了自定义授权模式已经完成简单的授权中心也已经升级完成上面WeiXinOpenGrantValidator验证器中我没有直接走数据库方式进行验证和注册简单的写了个Demo 大家有兴趣可以 把TODO那一块数据库的操作去实现代码我已经提交到 github上了这里再次分享下我博客同步实战的demo 地址 https://github.com/a312586670/IdentityServerDemo四、思考与总结本篇我介绍了自定义授权方式通过查看源代码及查阅资料学习了IdentityServer4 可以通过自定义授权方式进行扩展。这样授权中心可以扩展多套授权方式比如今天所分享的 自定义微信openId 授权、短信验证码授权等其他自定义授权一套Api资源可以兼并多套授权模式灵活扩展灵活升级。本篇涉及的知识点不多但是非常重要因为我们在使用授权中心统一身份认证时经常会遇到多种认证方式的结合和多套不同应用用户的使用在掌握了授权原理后就能在不同的授权方式中切换的游刃有余到这里有的博友会问AccentToken 有过期时间会过期怎么办难道要重新授权一次吗这些问题我会安排下一篇文章分享。灵魂一问上面的授权中心 例子主要是为了让大家更好的理解自定义授权的使用场景及它的灵活性真实的场景这样直接把 openId等相关信息来验证授权安全吗大家可以思考下如果不安全大家又有什么好的解决方案呢自我提升在于不停的自我思考大家可以敬请的发挥自己的思考把解决方案留在留言板中以供大家参考学习感谢如果觉得对你有用希望帮忙点下右下角星星写文章、写代码都不容易。鼓励下坚持写文章的动力