ASP.NET Core 1.x提供了通过Cookie 中间件将用户主体序列化为一个加密的Cookie,然后在后续请求中验证Cookie并重新创建主体,并将其分配给HttpContext.User
属性。如果您要提供自己的登录界面和用户数据库,可以使用作为独立功能的Cookie中间件。
ASP.NET Core 2.x的一个主要变化是不再存在Cookie中间件。取而代之的是在Startup.cs文件中的Configure
方法中的调用UseAuthentication
方法会添加设置HttpContext.User
属性的 AuthenticationMiddleware 中间件。
添加配置
ASP.NET Core 1.x
按下列步骤操作:
在您的项目中安装
Microsoft.AspNetCore.Authentication.Cookies
NuGet包。此包包含Cookie中间件。在Startup.cs文件中的
Configure
方法中添加下面的行,在app.UseMvc()
语句之前:app.UseCookieAuthentication(new CookieAuthenticationOptions() { AccessDeniedPath = "/Account/Forbidden/", AuthenticationScheme = "MyCookieAuthenticationScheme", AutomaticAuthenticate = true, AutomaticChallenge = true, LoginPath = "/Account/Unauthorized/" });
ASP.NET Core 2.x
按下列步骤操作:
如果不使用
Microsoft.AspNetCore.All
元包,则在您的项目中安装2.0版的Microsoft.AspNetCore.Authentication.Cookies
NuGet包。在Startup.cs文件中的
Configure
方法中调用UseAuthentication
方法:app.UseAuthentication();
在Startup.cs文件中的
ConfigureServices
方法中调用AddAuthentication
和AddCookie
方法:services.AddAuthentication("MyCookieAuthenticationScheme") .AddCookie("MyCookieAuthenticationScheme", options => { options.AccessDeniedPath = "/Account/Forbidden/"; options.LoginPath = "/Account/Unauthorized/"; });
上面的代码片段配置了以下部分或全部选项:
AccessDeniedPath
- 当用户尝试访问资源但没有通过任何授权策略时,这是请求会重定向的相对路径资源。AuthenticationScheme
- 这是一个已知的特定Cookie认证方案的值。当有多个Cookie验证实例,并且您想限制对一个实例的授权时,这就非常有用。AutomaticAuthenticate
- 此标识仅适用于ASP.NET Core 1.x。它表示Cookie身份验证应在每个请求上运行,并尝试验证和重建序列化主体。AutomaticChallenge
- 此标识仅适用于ASP.NET Core 1.x。这表示当授权失败时,1.x Cookie认证应将浏览器重定向到LoginPath
或AccessDeniedPath
。LoginPath
- 当用户尝试访问资源但尚未认证时,这是请求重定向的相对路径。
其它选项包括为Cookie认证创建的设置选项,身份验证的Cookie的名称,Cookie的域和Cookie各种安全属性。默认情况下,Cookie身份验证为其创建的任何Cookie使用适当的安全选项,例如:
设置HttpOnly标志以防止客户端JavaScript中访问Cookie
如果请求是通过HTTPS访问,则将Cookie限制为HTTPS
创建身份认证Cookie
要创建一个保存用户信息的cookie,您必须构建一个ClaimsPrincipal 保存您希望序列化到Cookie中的信息。
ASP.NET Core 1.x
await HttpContext.Authentication.SignInAsync("MyCookieAuthenticationScheme", principal);
ASP.NET Core 2.x
await HttpContext.SignInAsync("MyCookieAuthenticationScheme", principal);
这将创建一个加密的Cookie并将其添加到当前响应中。在调用SignInAsync
时,必须在配置中指定的AuthenticationScheme
。