IdentityServer4 sign-in
Sign-in
IdentityServer 代表 user 分配token之前,user必须登录IdentityServer
Cookie authentication
使用 cookie 进行身份认证的方式,是通过 Asp.Net Core 的 cookie authentication handler 实现的。
IdentityServer 注册了两个 cockie handler(一个用来身份认证中的session,另外用于一个temporary external cookie)。两者是默认配置使用的,可以通过 IdentityServerConstants
类获得他们的名称(DefaultCookieAuthenticationScheme
和 ExternalCookieAuthenticationScheme
)
以上的cookie只提供一个基本的配置(过期时间和 sliding
),也可以通过注册自己的cookie handler来控制更多的内容。当使用ASP.NET Core中的AddAuthentication
时,IdentityServer使用与AuthenticationOptions
上配置的DefaultAuthenticateScheme
匹配的cookie处理程序。
重写 cookie handler configuration
ConfigureService
时,在DI中注入 IdentityServer (通过AddIdentityServer
)之后,再天剑自定义的 cookie authentication handler
services.AddIdentityServer()
.AddInMemoryClients(Clients.Get())
.AddInMemoryIdentityResources(Resources.GetIdentityResources())
.AddInMemoryApiResources(Resources.GetApiResources())
.AddDeveloperSigningCredential()
.AddTestUsers(TestUsers.Users);
services.AddAuthentication("MyCookie")
.AddCookie("MyCookie", options =>
{
options.ExpireTimeSpan = ...;
});
NOTE IdentityServer 内部会调用
AddAuthentication
和AddCookie
方法,并使用IdentityServerConstants.DefaultCookieAuthenticationScheme
的自定义 Scheme,所以需要在调用AddIdentityServer
之后再去调用这两个方法进行覆盖重写。
用户登录接口和身份认证管理系统
IdentityServer 没有提供 user 身份认证的用户界面或者用户数据库。自行开发。
Login 的流程
NOTE open-redirect attack,确保 returnUrl 是合法的, 参考 interaction service
Login Context
在 interaction service 调用 GetAuthorizationContextAsync
可以在登录页面获取到request的上下文信息(比如:client, 提示参数, idP(identity provider) 提示等等),以便于自定义登录的体验。
生成 cookie 和 claims
在 Asp.Net 的HttpContext
中有身份认证相关的扩展方法,用于生成 身份认证的 cookie 以及用户登录。 authentication 的scheme 必须符合cookie handler中配置的值。
当用户登录之后,至少要生成 sub
以及 name
的 claim。 IdentityServer 同样也在 HttpContext
中 提供几个 SignInAsync
扩展方法,使得使用起来更方便。
也可以生成 idp
claim(identity provider 的 name),amr
claim(authentication method使用),和/或 auth_time
claim(用户authentication的时间)。如果不提供这些值, identityServer 会提供默认的值。