本节将在第四节基础上介绍如何实现IdentityServer4从数据库获取User进行验证,并对Claim进行权限设置。
一、新建Web API资源服务,命名为ResourceAPI
(1)新建API项目,用来进行user的身份验证服务。
(2)配置端口为5001
安装Microsoft.EntityFrameworkCore包
安装Microsoft.EntityFrameworkCore.SqlServer包
安装Microsoft.EntityFrameworkCore.Tools包
(3)我们在项目添加一个 Entities文件夹。
新建一个User类,存放用户基本信息,其中Claims为一对多的关系。
其中UserId的值是唯一的。
新建Claims类
继续新建 UserContext.cs
(4)修改startup.cs中的ConfigureServices方法,添加SQL Server配置。
完成后在程序包管理器控制台运行:Add-Migration InitUserAuth
生成迁移文件。
(5)添加Models文件夹,定义User的model类和Claims的model类。
在Models文件夹中新建User类:
新建Claims类:
做Model和Entity之前的映射。
添加类UserMappers:
类UserContextProfile:
(6)在startup.cs中添加初始化数据库的方法InitDataBase方法,对User和Claim做级联插入。
(7)在startup.cs中添加InitDataBase方法的引用。
运行程序,这时候数据生成数据库UserAuth,表Users中有一条UserName=zhubingjian,Password=123的数据。
二、实现获取User接口,进行身份验证
(1)先对API进行保护,在Startup.cs的ConfigureServices方法中添加:
并在Configure中,将UseAuthentication身份验证中间件添加到管道中,以便在每次调用主机时自动执行身份验证。
app.UseAuthentication();
(2)接着,实现获取User的接口。
在ValuesController控制中,添加如下代码:
好了,资源服务器获取User的接口完成了。
(3)接着回到AuthServer项目,把User改成从数据库进行验证。
找到AccountController控制器,把从内存验证User部分修改成从数据库验证。
主要修改Login方法,代码给出了简要注释:
可以看到,在IdentityServer4更新后,旧版获取tokenResponse的方法已过时,但我按官网文档的说明,使用新方法(注释的代码),获取不到信息,还望大家指点。
官网链接:https://identitymodel.readthedocs.io/en/latest/client/token.html
所以这里还是按老方法来获取tokenResponse。
(4)到这步后,可以把Startup中ConfigureServices方法里面的AddTestUsers去掉了。
运行程序,已经可以从数据进行User验证了。
点击进入About页面时候,出现没有权限提示,我们会发现从数据库获取的User中的Claims不起作用了。
三、使用数据数据自定义Claim
为了让获取的Claims起作用,我们来实现IresourceOwnerPasswordValidator接口和IprofileService接口。
(1)在AuthServer中添加类ResourceOwnerPasswordValidator,继承IresourceOwnerPasswordValidator接口。
(2)ProfileService类实现IprofileService接口:
(3)发现代码里面需要在ResourceAPI项目的ValuesController控制器中
添加根据UserId获取User的Claims的接口。
(4)修改AuthServer中的Config中GetIdentityResources方法,定义从数据获取的Claims为role的信息。
(5)在GetClients中把定义的mvc.profile加到Scope配置
(6)最后记得在Startup的ConfigureServices方法加上
.AddResourceOwnerValidator()
.AddProfileService();
运行后,出现熟悉的About页面(Access Token后面加上去的,源码上有添加方法)
本节介绍的IdentityServer4通过访问接口的形式验证从数据库获取的User信息。当然,也可以写成AuthServer授权服务通过连接数据库进行验证。
另外,授权服务访问资源服务API,用的是ClientCredentials模式(服务与服务之间访问)。
参考博客:https://stackoverflow.com/questions/35304038/identityserver4-register-userservice-and-get-users-from-database-in-asp-net-core
源码地址:https://github.com/Bingjian-Zhu/Mvc-HybridFlow.git
相关文章:
从Client应用场景介绍IdentityServer4(一)
IdentityServer4-EF动态配置Client和对Claims授权(二)
IdentityServer4-客户端的授权模式原理分析(三)
IdentityServer4-MVC+Hybrid实现Claims授权验证(四)
基于IdentityServer4 实现.NET Core的认证授权
IdentityServer4与ocelot实现认证与客户端统一入口
使用Dapper持久化IdentityServer4
原文地址: https://www.cnblogs.com/FireworksEasyCool/p/10181681.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com