为了使IdentityServer代表用户发布令牌,该用户必须登录到IdentityServer。
使用来自ASP.NET Core的cookie身份验证处理程序管理的cookie跟踪身份验证。
IdentityServer注册两个cookie处理程序(一个用于身份验证会话,另一个用于临时的外部cookie)。 这些在默认情况下使用,如果您想手动引用它们,您可以从IdentityServerConstants
类(DefaultCookieAuthenticationScheme
和ExternalCookieAuthenticationScheme
)获取它们的名称。
我们只公开这些cookies的基本设置(过期和滑动),如果你需要更多的控制,你可以注册你自己的cookie处理程序。 当使用来自ASP.NET Core的AddAuthentication
时,IdentityServer使用与AuthenticationOptions
上配置的DefaultAuthenticateScheme
相匹配的cookie处理程序。
如果你想使用你自己的cookie身份验证处理程序,那么你必须自己配置它。 在DI中注册身份服务器(使用AddIdentityServer
)后,必须在ConfigureServices
中完成此操作。 例如:
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
之后进行相同的调用。
IdentityServer不提供任何用户界面或用户数据库进行用户认证。 这些是你期望提供或发展自己的东西。
如果您需要基本用户界面(登录,注销,同意和管理授权)的起点,则可以使用我们的快速入门界面。
快速入门的用户界面根据内存数据库对用户进行认证。 你想取代这些那么请使用你的真实用户存储。 我们有使用ASP.NET Identity的示例。
当IdentityServer在授权端点收到请求,且用户没有通过认证时,用户将被重定向到配置的登录页面。 您必须通过设置UserInteraction
(默认为/ account / login)来通知IdentityServer您的登录页面的路径。 将会传递一个returnUrl参数,通知你的登录页面,一旦登录完成,用户应该被重定向到哪里。
注意通过returnUrl参数的开放重定向攻击。 你应该验证这个returnUrl指的是已知的位置。 请参阅API的交互服务来验证returnUrl参数(https://identityserver4.readthedocs.io/en/release/reference/interactionservice.html#refinteractionservice)。
在您的登录页面上,您可能需要有关请求上下文的信息,以便自定义登录体验(如客户端,提示参数,IdP提示或其他内容)。 这可以通过交互服务上的GetAuthorizationContextAsync
API获得(https://identityserver4.readthedocs.io/en/release/reference/interactionservice.html#refinteractionservice)。
在ASP.NET Core的HttpContext
上有与身份验证相关的扩展方法来发布身份验证cookie并签署用户。所使用的身份验证方案必须与您正在使用的cookie处理程序(请参阅上文)匹配。
当用户登录时,你必须至少发出一个子sub身份单元和一个name身份单元。 IdentityServer还在HttpContext上提供了一些SignInAsync
扩展方法,以使这更方便。
您还可以选择发出idp身份单元(针对身份提供者名称),amr声明(针对使用的身份验证方法)或者auth_time声明(针对用户认证的认证时间)。 如果您不提供这些,IdentityServer将提供默认值。