ASP.NET Core的身份认证框架IdentityServer4(8)- 使用密码认证方式控制API访问
2017-09-12 13:20
2291 查看
前言
本文及IdentityServer这个系列使用的都是基于.net core 2.0的。上一篇博文在API项目中我使用了
Microsoft.AspNetCore.Authentication.JwtBearer组件来代替
IdentityServer4.AccessTokenValidation组件,今天(2017-9-12)我发现后者已经更新到了2.0.0,支持.net core 2.0,所以现在所使用的组件已经更新为后者,在代码里我有详细注释。
资源所有者密码授权
OAuth 2.0 资源所有者密码授权允许一个客户端发送用户名和密码到IdentityServer并获得一个表示该用户的可以用于访问api的Token。该规范建议仅对“受信任”应用程序使用资源所有者密码授权。 一般来说,当您要验证用户并请求访问令牌时,通常使用交互式OpenID Connect流会更好。
不过,这个授权类型允许我们在 IdentityServer 快速入门中引入 用户 的概念,这是我们要展示它的原因。
添加用户
就像基于内存存储的资源(即 范围 Scopes)和客户端一样,对于用户也可以这样做。注意:查看基于 ASP.NET Identity 的快速入门以获得更多关于如何正确存储和管理用户账户的信息。
TestUser类型表示一个测试用户及其身份信息。让我们向配置类(如果你有严格按照顺序进行演练,那么配置类应该在 QuickstartIdentityServer 项目的 Config.cs 文件中)中添加以下代码以创建一对用户:
首先添加以下语句 到
Config.cs文件中:
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) { // 使用内存存储,密钥,客户端和资源来配置身份服务器。 services.AddIdentityServer() .AddDeveloperSigningCredential() .AddInMemoryApiResources(Config.GetApiResources())//添加api资源 .AddInMemoryClients(Config.GetClients())//添加客户端 .AddTestUsers(Config.GetUsers()); //添加测试用户 }
AddTestUsers 方法帮我们做了以下几件事:
为资源所有者密码授权添加支持
添加对用户相关服务的支持,这服务通常为登录 UI 所使用(我们将在下一个快速入门中用到登录 UI)
为基于测试用户的身份信息服务添加支持(你将在下一个快速入门中学习更多与之相关的东西)
为资源所有者密码授权添加一个客户端定义
你可以通过修改 ·AllowedGrantTypes· 属性简单地添加对已有客户端授权类型的支持。通常你会想要为资源所有者用例创建独立的客户端,添加以下代码到你配置中的客户端定义中:
// client want to access resources (aka scopes) public static IEnumerable<Client> GetClients() { return new List<Client> { new Client { ClientId = "client", // 没有交互性用户,使用 clientid/secret 实现认证。 AllowedGrantTypes = GrantTypes.ClientCredentials, // 用于认证的密码 ClientSecrets = { new Secret("secret".Sha256()) }, // 客户端有权访问的范围(Scopes) AllowedScopes = { "api1" } }, // resource owner password grant client new Client { ClientId = "ro.client", AllowedGrantTypes = GrantTypes.ResourceOwnerPassword, ClientSecrets = { new Secret("secret".Sha256()) }, AllowedScopes = { "api1" } } }; }
使用密码授权请求一个令牌
客户端看起来跟之前客户端证书授权的客户端是相似的。主要差别在于现在的客户端将会以某种方式收集用户密码,然后在令牌请求期间发送到令牌服务。
IdentityModel 的
TokenClient在这里再次为我们提了供帮助:
// 从元数据中发现客户端 var disco = await DiscoveryClient.GetAsync("http://localhost:5000"); // 请求令牌 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");
当你发送令牌到身份 API 端点的时候,你会发现与客户端凭证授权
相比,资源所有者密码授权有一个很小但很重要的区别。访问令牌现在将包含一个
sub信息,该信息是用户的唯一标识。
sub信息可以在调用 API 后通过检查内容变量来被查看,并且也将被控制台应用程序显示到屏幕上。
sub信息的存在(或缺失)使得 API 能够区分代表客户端的调用和代表用户的调用。
下面这张图,是理解的客户端请求流程,如果有不对的地方欢迎批评指正:
最后github地址:https://github.com/stulzq/IdentityServer4.Samples/tree/master/Quickstarts/2_ResourceOwnerPasswords 如果你觉得对你有用,欢迎star
相关文章推荐
- ASP.NET Core的身份认证框架IdentityServer4(7)- 使用客户端证书控制API访问
- ASP.NET Core的身份认证框架IdentityServer4(7)- 使用客户端证书控制API访问
- ASP.NET Core的身份认证框架IdentityServer4(7)- 使用客户端证书控制API访问
- ASP.NET Core的身份认证框架IdentityServer4--(3)令牌服务配置访问控制跟UI添加
- ASP.NET Core的身份认证框架IdentityServer4(9)-使用OpenID Connect添加用户认证
- ASP.NET Core的身份认证框架IdentityServer4--(2)API跟WEB端配置
- ASP.NET Core的身份认证框架IdentityServer4(4)- 支持的规范
- ASP.NET Core的身份认证框架IdentityServer4(5)- 包和构建
- ASP.NET Core的身份认证框架IdentityServer4(1)-特性一览
- ASP.NET Core的身份认证框架IdentityServer4(6)- 开始
- ASP.NET Core身份认证服务框架IdentityServer4(2)-整体介绍
- ASP.NET Core的身份认证框架IdentityServer4--(4)添加第三方快捷登录
- ASP.NET Core的身份认证框架IdentityServer4--(1)服务配置
- ASP.NET Core的身份认证框架IdentityServer4(3)-术语的解释
- ASP.NET Core的身份认证框架IdentityServer4(3)-术语的解释
- 【译】使用Jwt身份认证保护 Asp.Net Core Web Api
- Asp.NetCoreWebApi图片上传接口(二)集成IdentityServer4授权访问(附源码)
- IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API
- IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API
- 【译】使用Jwt身份认证保护 Asp.Net Core Web Api