一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情
1.使用密码保护API
OAuth 2.0资源所有者密码授权允许客户端向令牌服务发送用户名和密码,并获取代表该用户的访问令牌。
除了无法承载浏览器的旧应用程序之外,规范通常建议不要使用资源所有者密码授予。一般来说,当要对用户进行身份验证并请求访问令牌时,使用其中一个交互式OpenID Connect流程通常要好一些。
2.添加用户
类似基于内存存储的资源(即 范围 Scopes)和客户端一样,对于用户也可以这样做。
TestUser类代表测试用户及其声明。让我们通过在config类中添加以下代码来创建几个用户:
首先将以下 using语句添加到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.GetApis())
.AddInMemoryClients(Config.GetClients())
.AddTestUsers(Config.GetUsers());
}
该AddTestUsers扩展方法在背后做了以下几件事:
- 添加对资源所有者密码授予的支持
- 添加对登录UI通常使用的用户相关服务的支持
- 添加对基于测试用户的配置文件服务的支持
3.为资源所有者密码授权添加客户端
可以通过更改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" }
}
};
}
4.密码授权请求令牌
在解决方案中添加新的控制台客户端,客户端看起来与为客户端凭据授权非常相似。主要区别在于客户端会以某种方式收集用户的密码,并在令牌请求期间将其发送到令牌服务。
// 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唯一标识用户的声明。通过在调用API之后检查内容变量可以看到这个sub声明,并且控制器应用程序也会在屏幕上显示该声明。
sub信息的存在(或缺失)使得 API 能够区分代表客户端的调用和代表用户的调用。
5.对外部认证的支持
接下来,添加对外部认证的支持。因为真正需要的是ASP.NET Core兼容的身份验证处理程序。
ASP.NET Core本身支持Google,Facebook,Twitter,Microsoft Account和OpenID Connect
6.添加三方登录支持
要使用Google进行身份验证,首先需要向他们注册。这是在他们的开发者控制台完成的。通过将/signin-google路径添加到您的基地址(例如http//localhost5000/signin-google),创建一个新项目,启用Google+ API并配置您本地IdentityServer的回调地址。
开发者控制台将向您显示由Google发布的客户端ID和密码 - 您将在下一步中使用该密码。
将Google身份验证处理程序添加到IdentityServer主机的DI中。这是通过添加该代码段完成Startup的ConfigureServices:
services.AddAuthentication()
.AddGoogle("Google", options =>
{
options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
options.ClientId = "<insert here>";
options.ClientSecret = "<insert here>";
});
默认情况下,IdentityServer专门为外部身份验证的结果配置cookie处理程序(使用基于常量的方案IdentityServerConstants.ExternalCookieAuthenticationScheme)。然后,Google处理程序的配置使用该cookie处理程序。
现在运行MVC客户端并尝试进行身份验证 - 将在登录页面上看到一个Google按钮:
在使用MVC客户端进行身份验证后,可以看到声明现在来自Google数据。