第21章 登录 - Identity Server 4 中文文档(v1.0.0)
为了使IdentityServer能够代表用户发出令牌,该用户必须登录IdentityServer。
21.1 Cookie身份验证
使用由ASP.NET Core中的cookie身份验证处理程序管理的cookie来跟踪身份验证。
IdentityServer注册了两个cookie处理程序(一个用于身份验证会话,另一个用于临时外部cookie)。默认情况下使用它们,如果要手动引用它们,可以从IdentityServerConstants
类(DefaultCookieAuthenticationScheme
和ExternalCookieAuthenticationScheme
)中获取它们的名称。
我们只公开这些cookie的基本设置(到期和滑动),如果您需要更多控制,您可以注册自己的cookie处理程序。当使用ASP.NET Core中的AddAuthentication
时,IdentityServer使用与AuthenticationOptions
上配置的DefaultAuthenticateScheme
匹配的cookie处理程序。
21.2 覆盖cookie处理程序配置
如果您希望使用自己的cookie身份验证处理程序,则必须自己配置它。这必须在ConfigureServices
DI(AddIdentityServer
)中注册IdentityServer之后完成。例如:
services.AddIdentityServer()
.AddInMemoryClients(Clients.Get())
.AddInMemoryIdentityResources(Resources.GetIdentityResources())
.AddInMemoryApiResources(Resources.GetApiResources())
.AddDeveloperSigningCredential()
.AddTestUsers(TestUsers.Users);
services.AddAuthentication("MyCookie")
.AddCookie("MyCookie", options =>
{
options.ExpireTimeSpan = ...;
});
注意
IdentityServer在内部使用自定义方案(通过常量IdentityServerConstants.DefaultCookieAuthenticationScheme
)调用AddAuthentication
和AddCookie
,因此要覆盖它们,您必须在AddIdentityServer
之后进行相同的调用。
21.3 登录用户界面和身份管理系统
IdentityServer不为用户身份验证提供任何用户界面或用户数据库。 这些是您希望自己提供或开发的东西。
如果您需要基本UI的起点(登录,注销,同意和管理授权),您可以使用我们的快速入门UI。
快速入门UI针对内存数据库对用户进行身份验证。 您可以通过访问真实用户存储来替换这些位。 我们有使用ASP.NET Identity的示例。
21.4 登录工作流程
当IdentityServer在授权端点收到请求且未对用户进行身份验证时,将用户重定向到已配置的登录页面。 您必须通过选项上的UserInteraction
设置(默认/account/login
)通知IdentityServer登录页面的路径。 将传递returnUrl
参数,通知您的登录页面,一旦登录完成,应该重定向用户。
注意
通过returnUrl
参数注意open-redirect attacks攻击。 您应该验证returnUrl
是否引用了众所周知的位置。 请参阅API的交互服务以验证returnUrl
参数。
21.5 登录上下文
在您的登录页面上,您可能需要有关请求上下文的信息,以便自定义登录体验(例如客户端,提示参数,IdP提示或其他内容)。这可以通过交互服务上的GetAuthorizationContextAsync
API获得。
21。6 发行cookie和声明
ASP.NET Core上的HttpContext
上有与身份验证相关的扩展方法,用于发出身份验证cookie并对用户进行签名。使用的身份验证方案必须与您正在使用的cookie处理程序匹配(请参见上文)。
当您签署用户时,您必须至少发出一个sub
和一个name
声明。 IdentityServer还在HttpContext
上提供了一些SignInAsync
扩展方法,以使这更方便。
您还可以选择发出idp
声明(针对身份提供者名称),amr
声明(针对所使用的身份验证方法)和/或auth_time
声明(针对用户身份验证的纪元时间)。如果您不提供这些,IdentityServer将提供默认值。