Sign-in 登陆注册
为了让标识服务器(identity server)代表用户发出令牌,该用户必须登录到标识服务器。
Cookie authentication Cookie认证
身份验证是由来自ASP.NET Core的cookie认证处理程序(cookie authentication handler)管理的cookie进行跟踪的。
IdentityServer注册了两个cookie处理程序(一个用于认证会话,另一个用于零时外部cookie)。这些都是默认使用的,并且如果你想手动的引用他们的话你可以通过IdentityServerConstants类(DefaultCookieAuthenticationScheme和ExternalCookieAuthentication Scheme)来获取他们的名字。
对于这些Cookies,我们只暴露了一些基本的设置,如果你想要更多的控制,你可以注册你自己的cookie handler。当使用来自ASP.NET Core的AddAuthentication时,身份服务器使用任何在DefaultAuthenticationOptions中配置的DefaultAuthenticateScheme相匹配的cookie处理程序。
Overriding cookie handler configuration重写cookie handler的配置
如果你希望使用你自己的cookie authentication handler,你得自己去配置。这个工作是在ConfigureSerrvice中完成的,在AddIdentityServer扩展方法之后你可以链式的添加你的配置:
services.AddIdentityServer() .AddInMemoryClients(Clients.Get()) .AddInMemoryIdentityResources(Resources.GetIdentityResources()) .AddInMemoryApiResources(Resources.GetApiResources()) .AddDeveloperSigningCredential() .AddTestUsers(TestUsers.Users); //在这里配置你自己的cookie authentication handler services.AddAuthentication("MyCookie") .AddCookie("MyCookie", options => { options.ExpireTimeSpan = ...; });
需要注意的是IdentityServer在内部已经调用了AddAuthentication和AddCookie这两个方法,根据asp.net core的DI原则,你必须在AddIdentityServer之后注册你自己的handler,这样才会生效(添加相同的服务时,最后一个才会生效,除非你调用GetServices这个复数的版本。。。)
Login User Interface and Identity Management System 登陆用户接口界面和身份管理系统
身份验证服务器不提供用户身份验证的用户接口或界面或用户数据库。这些得你自己提供。
如果你想要一个基本的界面(例如登陆、登出、用户确认界面和管理授权),你可以使用IdentityServer4i提供的quickstart UI.
quickstart UI使用内存中的存储来应付用户的认证,你可以把这部分替换成你的真实的用户库。这里有一个使用ASP.NET Identity的例子
Login Workflow 登陆的工作流程
当IdentityServer在authorization endpoint(identityserver中定义的一个端点)接收到一个请求,但是这时用户还没有被认证,那么这个用户将被重定向到预先配置好的登陆界面。你必须通过UserInteraction这个设置项(默认是/account/login)告知IdentityServer如何到达登陆页,例如下面这样:
services.AddIdentityServer(option => { option.UserInteraction.LoginUrl = "Account/Login"; });
一个returnUrl参数将被传递用来告诉登陆页面当登陆完成时用户应该被重定向到哪里。
要注意通过returnUrl参数带来的open-redirect attacks(开放重定向攻击)。你应该检查returnURl是否指向了一个已知(well-known)的位置。查看interaction service获取更多的资料。
Login Context 登陆上下文
在登录页上你可能想要获取一些关于请求的上下文信息以便你可以定制登陆的一些体验(比如客户端信息、提示参数、Idp提示或者其他的信息)。这些上下文的信息是通过interaction service的GetAuthorizationContextAsync方法来实现的。
Issuing a cookie and Claims 发布cookie和Claim
在Asp.net core中的HttpContext上有一些关于认证方面的扩展方法,用来发布cookie和登陆。认证方案(authentication scheme,用来标识一个authentication handler)在使用上必须与cookie handler(cookie认证处理程序)匹配。
当让一个用户登陆时,最基本的要求是你得给该用户颁发一个sub claim和一个name claim。IdentityServer也提供了一些SigninAsync扩展方法以便让这项工作更便利。
你还可以选择性地颁发idp claim(对于身份提供者名称)、amr claim(用于使用的认证方法)和/或auth_time claim(对于用户验证的时间)。如果你不提供这些,那么身份服务器将会提供一些默认值。