IdentityServer4示例之使用ResourceOwnerPassword流程来保护API
2021-03-27 02:26
标签:imp 概念 重要 in-memory console syn other async word OAuth2.0中的ResourceOwnerPassword授权流程允许一个客户端发送username和password到token服务上面,以便获取一个代表用户的access token。 ”规范“中建议只对受信任的客户端使用这种授权类型。通常情况来讲,在有用户交互的场景下,你应该优先使用OpenID Connect协议中的其中一个流程(有authorization code 、implicit、hybrid)来对用户进行认证,并获取access token。 话虽如此,这种授权类型引入了IdentityServer中的用户的概念,这也是我们要展现它的唯一原因。 就像内存中的资源(或者叫做scopes)和客户端,也可以创建内存中的用户。 TestUser类代表了一个测试用户和它的一些声明(claim)。我们现在在Config类中创建一些用户: 然后在ConfigureService方法中注入: AddTestUsers扩展方法在后台做了这么几件事: 如果你想要客户端对于这两种授权类型都支持,你可以在现有的客户端上面通过修改AllowedGrantTypes属性的值来添加对这种授权类型的支持。 通常情况下你只是想要创建一个单独的客户端作为resource owner password这种授权类型的场景下使用,在Config类的GetClients方法中添加以下的代码: 上面定义的那个客户端看起来和我们先前定义的client credentials客户端看起来很像。最主要的不同在于现在客户端会收集用户的密码,并在请求token的过程中将他连同其他东西一起发送到token service上面。 再次使用IdentityModel的TokenCLient来帮助我们实现这个请求: 当你向API发送token的时候,你会发现一个非常小而又非常重要的改变(相对于clientcredential这种授权类型来说):access token现在包含了一个”sub“的claim,这个claim就是用的唯一标识(在Config类中定义的TestUser的subjectid属性就是这里的东西),这个不同会通过api的方法返回的json里面发现。我在这里展示1下,我通过postman: 首先是通过client credential这种授权获取的token来访问api的,获取的结果如下: 看一看出没有sub这个声明。 然后使用resource owner password这个授权类型来搞到token,再用这个token访问一下api: IdentityServer4示例之使用ResourceOwnerPassword流程来保护API 标签:imp 概念 重要 in-memory console syn other async word 原文地址:https://www.cnblogs.com/pangjianxin/p/9367434.html使用ResourceOwnerPassword流程来保护API
添加用户
using IdentityServer4.Test;
public static List
public void ConfigureServices(IServiceCollection services)
{
// configure identity server with in-memory stores, keys, clients and scopes
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients())
.AddTestUsers(Config.GetUsers());
}
为resource owner password这种授权类型创建一个相应的客户端
public static IEnumerable
使用password的授权类型来请求token
// request token
var tokenClient = new TokenClient(disco.TokenEndpoint, "ro.client", "secret");
var tokenResponse = await tokenClient.RequestResourceOwnerPasswordAsync("alice", "password", "api1");
if (tokenResponse.IsError)
{
Console.WriteLine(tokenResponse.Error);
return;
}
Console.WriteLine(tokenResponse.Json);
Console.WriteLine("\n\n");
[
{
"claimType": "nbf",
"claimValue": "1532508154"
},
{
"claimType": "exp",
"claimValue": "1532511754"
},
{
"claimType": "iss",
"claimValue": "http://localhost:5000"
},
{
"claimType": "aud",
"claimValue": "http://localhost:5000/resources"
},
{
"claimType": "aud",
"claimValue": "api1"
},
{
"claimType": "client_id",
"claimValue": "firstClient"
},
{
"claimType": "scope",
"claimValue": "api1"
}
]
[
{
"claimType": "nbf",
"claimValue": "1532511508"
},
{
"claimType": "exp",
"claimValue": "1532515108"
},
{
"claimType": "iss",
"claimValue": "http://localhost:5000"
},
{
"claimType": "aud",
"claimValue": "http://localhost:5000/resources"
},
{
"claimType": "aud",
"claimValue": "api1"
},
{
"claimType": "client_id",
"claimValue": "secondClient"
},
{
"claimType": "sub",
"claimValue": "2"
},
{
"claimType": "auth_time",
"claimValue": "1532511508"
},
{
"claimType": "idp",
"claimValue": "local"
},
{
"claimType": "scope",
"claimValue": "api1"
},
{
"claimType": "amr",
"claimValue": "pwd"
}
]
文章标题:IdentityServer4示例之使用ResourceOwnerPassword流程来保护API
文章链接:http://soscw.com/index.php/essay/68381.html