通过IdentityServer4的身份验证ASP .NET核心

这里没有什么不寻常的,一个IdentityServer4框架将使用某个Api上的用户名和密码进行身份验证,以及句柄refresh_token。

它将与现有的IdentityDbContext IdentityUser一起使用。

结果将是一个场景,其中对于每个身份验证,将发出一个refresh_token并将其存储在PersistedGrants表中。 这是OAuth 2.0权限的四种类型之一:

资源所有者密码凭证:由受信任的应用程序使用,例如属于服务本身的应用程序。

所有令牌维护工作均由框架承担。

因此,让我们开始吧。

为了指定解决方法,设置了“客户端”,我将有一个:

DataLayer.Config

new Client { ClientId = _configurationManager.Value.ClientId, AllowedGrantTypes = GrantTypes.ResourceOwnerPassword, //   RequireClientSecret = false, //Client Secret    ,  AllowedScopes = { _configurationManager.Value.ApiName, IdentityServerConstants.StandardScopes.OpenId, IdentityServerConstants.StandardScopes.Profile},//      /connect/userinfo AllowOfflineAccess = true // - } 

接下来,此客户端在创建时就位于数据库中:

TestIdentityServer.Program

 services.GetRequiredService<DbInitializer>().Initialize(); 

在“初始化”方法中,添加了代码以创建必要的数据库并插入包括客户端在内的数据。 但在此之前,您需要执行迁移,因为您将必须创建一个包含3个上下文的数据库,其中第一个上下文是IdentityDbContext ApplicationUser,其余的用于IdentityServer4:

DataLayer.DbInitializer

  _context.Database.Migrate(); _configurationDbContext.Database.Migrate(); _persistedGrantDbContext.Database.Migrate(); 

  if (!_configurationDbContext.Clients.Any()) { foreach (var client in _config.GetClients().ToList()) { _configurationDbContext.Clients.Add(client.ToEntity()); } _configurationDbContext.SaveChanges(); } 

迁移:

 dotnet ef migrations add InitialIdentityServerPersistedGrantDbMigration -c PersistedGrantDbContext -o Data/Migrations/IdentityServer/PersistedGrantDb dotnet ef migrations add InitialIdentityServerConfigurationDbMigration -c ConfigurationDbContext -o Data/Migrations/IdentityServer/ConfigurationDb dotnet ef migrations add InitialAuthMigration -c AuthContext -o Data/Migrations/IdentityServer/Auth 

到代码的链接将在结尾。

来吧 在设置了客户端并创建了数据库之后,服务器已经可以通过使用密码登录来处理“ / connect / token”请求,并使用refresh_token发出access_token。
根据它,以refresh_token指示更新它们。

用户名密码:

图片

refresh_token

图片

/连接/用户信息

图片

现在添加一个将由IdentityServer4授权的api。 他与他的关系如下:

DataApi。启动

  services.AddAuthentication("Bearer") .AddIdentityServerAuthentication(options => { options.Authority = settings.Authority; //  http://localhost:5000 options.RequireHttpsMetadata = false; options.ApiName = settings.ApiName;//api1 }); 

API本身将部署到另一个端口。

现在将像往常一样使用“ [Authorize]”属性检查授权。

/ api /默认

图片



仅此而已,写下谁在想什么或缺少什么。

链接到代码

UPD:签名jwt令牌

添加了签名方法:启动时生成的RSA和* .pfx证书文件。 可以将相应的方法切换到属性“ SigningCredentialConfig”的“ appsettings.json”。

Source: https://habr.com/ru/post/zh-CN426289/


All Articles