登录

为了让 IdentityServer 代表用户颁发令牌,该用户必须登录到 IdentityServer。

覆盖 cookie 处理程序配置

如果您希望使用自己的 cookie 身份验证处理程序,则必须自己配置它。 这必须在 DI 中注册 IdentityServer(使用 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)在内部调用 AddAuthenticationAddCookie,因此要覆盖它们,您必须在 AddIdentityServer 之后进行相同的调用。

登录用户界面和身份管理系统

IdentityServer 不提供任何用于用户身份验证的用户界面或用户数据库。 这些是您自己应该提供或开发的东西。

如果您需要一个基本 UI(登录、注销、同意和管理授权)的起点, 您可以使用我们的 快速入门 UI

快速入门 UI 根据内存数据库对用户进行身份验证。 您可以使用对真实用户存储的访问权限来替换这些位。 我们有使用 ASP.NET Identity 的示例。

登录工作流程

当 IdentityServer 在授权端点收到请求并且用户未通过身份验证时,用户将被重定向到配置的登录页面。 您必须通过 选项 上的 UserInteraction 设置(默认为 /account/login)将登录页面的路径告知 IdentityServer。 将传递一个 returnUrl 参数,通知您的登录页面,一旦登录完成,用户应该被重定向到该页面。

../_images/signin_flow.png

注解

通过 returnUrl 参数请注意 开放式重定向攻击。 您应该验证 returnUrl 指的是众所周知的位置。 请参阅 API 的 interaction service 以验证 returnUrl 参数。

登录上下文

在您的登录页面上,您可能需要有关请求上下文的信息以自定义登录体验 (例如客户端、提示参数、IdP 提示或其他内容)。 这是通过 interaction service 上的 GetAuthorizationContextAsync API 提供的。

颁发 cookie 和声明

ASP.NET Core 的 HttpContext 上有与身份验证相关的扩展方法,用于发出身份验证 cookie 并让用户登录。 使用的身份验证方案必须与您使用的 cookie 处理程序匹配(见上文)。

当您登录用户时,您必须至少发布一个 sub 声明和一个 name 声明。 IdentityServer 还在 HttpContext 上提供了一些 SignInAsync 扩展方法,以使其更方便。

您还可以选择发出 idp 声明(用于身份提供者名称)、amr 声明(用于使用的身份验证方法)和/或 auth_time 声明(用于纪元时间 用户通过身份验证)。 如果您不提供这些,则 IdentityServer 将提供默认值。