本文已经更新到 .NET Core 2.2git
OAuth 2.0 资源全部者密码模式容许客户端向令牌服务发送用户名和密码,并获取表明该用户的访问令牌。github
除了经过没法浏览器进行交互的应用程序以外,一般建议不要使用资源全部者密码模式。 通常来讲,当您要对用户进行身份验证并请求访问令牌时,使用其中一个交互式 OpenID Connect 流程一般要好得多。api
在这里使用这种模式是为了学习如何快速在 IdentityServer 中使用它,浏览器
就像API资源(也称为 Scope)、客户端同样,用户也有一个基于内存存储(In-Memory)的实现。服务器
有关如何正确存储(持久化存储)和管理用户账户的详细信息,请查看基于 ASP.NET Identity的快速入门。ide
TestUser
类表明测试用户及其身份信息单元(Claim)。 让咱们经过在 config
类中添加如下代码来建立几个用户:post
首先添加如下语句 到Config.cs
文件中:学习
using IdentityServer4.Test; public static List<TestUser> GetUsers() { return new List<TestUser> { new TestUser { SubjectId = "1", Username = "alice", Password = "password" }, new TestUser { SubjectId = "2", Username = "bob", Password = "password" } }; }
而后将测试用户注册到 IdentityServer:测试
public void ConfigureServices(IServiceCollection services) { // configure identity server with in-memory stores, keys, clients and scopes services.AddIdentityServer() .AddInMemoryApiResources(Config.GetApiResources()) .AddInMemoryClients(Config.GetClients()) .AddTestUsers(Config.GetUsers()); }
AddTestUsers
方法帮咱们作了如下几件事:ui
你能够经过修改 ·AllowedGrantTypes· 属性简单地添加对已有客户端受权类型的支持。
一般你会想要为资源全部者用例建立独立的客户端,添加如下代码到你配置中的客户端定义中:
public static IEnumerable<Client> GetClients() { return new List<Client> { // other clients omitted... // resource owner password grant client new Client { ClientId = "ro.client", AllowedGrantTypes = GrantTypes.ResourceOwnerPassword, ClientSecrets = { new Secret("secret".Sha256()) }, AllowedScopes = { "api1" } } }; }
建立一个 ResourceOwnerPassword 控制台项目,经过Nuget添加 IdentityModel
包
经过以下代码获取Token
// request token var tokenResponse = await client.RequestPasswordTokenAsync(new PasswordTokenRequest { Address = disco.TokenEndpoint, ClientId = "ro.client", ClientSecret = "secret", UserName = "alice", Password = "password", Scope = "api1" }); if (tokenResponse.IsError) { Console.WriteLine(tokenResponse.Error); return; } Console.WriteLine(tokenResponse.Json);
当您将令牌发送到身份API终结点时,您会注意到与客户端模式相比有一个小但重要的区别。 访问令牌如今将包含惟一标识用户的sub
claim。 经过在调用API以后检查内容变量能够看到这个“sub”,而且控制器应用程序也会在屏幕上显示该claim。
sub claim的存在(或不存在)容许API区分表明客户端的调用和表明用户的调用。
下面这张图,是理解的客户端请求流程,
关于上图的补充说明,这里讲一下。api资源收到第一个请求以后,会去id4服务器公钥,而后用公钥验证token是否合法,若是合法进行后面后面的有效性验证。有且只有第一个请求才会去id4服务器请求公钥,后面的请求都会用第一次请求的公钥来验证,这也是jwt去中心化验证的思想。
使用postman调用生成token接口须要配置以下参数:
最后github地址:https://github.com/stulzq/IdentityServer4.Samples/tree/master/Quickstarts/2_ResourceOwnerPasswords 若是你以为对你有用,欢迎star