Authentication 和 Authorization
Authentication:认证。
Authorization:授权。
简单来说,认证是用来证明一个人的身份,比如说他是一个学生,一个老师,一个boss,那么就需要这么一个认证。授权是用来表示这个用户能做什么事情,比如admin可以修改删除数据,normal user只能查看数据。
注册服务
public void ConfigureServices(IServiceCollection services) { //注册Cookie认证服务 services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.Cookie.HttpOnly = true;
options.LoginPath = "/login";
options.ExpireTimeSpan = TimeSpan.FromDays(1);
}); }
在addcookie 中 CookieAuthenticationOptions
来设置相关的选项
选项 | 描述 |
---|---|
AccessDeniedPath | 当HttpContext.ForbidAsync 触发302时的跳转地址,默认/Account/AccessDenied |
ClaimsIssuer | 用于设置 cookie 的Issuer 属性。 |
Cookie.Domain | cookie的有效域。默认是请求的服务器名。浏览器只会给符合的服务器发送 cookie。你可能会希望设置这个值来调整他的作用域。举个例子,设置成.contoso.com 他的作用域就包括contoso.com ,www.contoso.com ,staging.www.contoso.com 等。 |
Cookie.Expiration | 获取或设置cookie的有效期。core 2.1+不建议使用。建议是使用ExpireTimeSpan 来设置 cookie 的失效时间。 |
Cookie.HttpOnly | 设置 cookie 是否是只能被服务器访问,默认 true,可以设置成 false 给客户端js 脚本访问,但是有可能会造成XSS(跨站脚本攻击)。 |
Cookie.Name | cookie 的名字。 |
Cookie.Path | 用来隔离同一个服务器下面的不同站点。比如站点是运行在/app1 下面,设置这个属性为/app1 ,那么这个 cookie 就只在 app1下有效。 |
Cookie.SameSite | 表示浏览器是否允许 cookie 被附加到相同的站点。有几种枚举:SameSiteMode.Strict ,只允许相同的站点。SameSiteMode.Lax 允许以安全的 http方式附加到不同站点或相同站点。为了支持 OAuth 认证,需要设置成SameSiteMode.Lax 。 |
Cookie.SecurePolicy | 设置是否只允许 https。 |
DataProtectionProvider | 用于设置创建TicketDataFormat (在表格最后) |
Events | 设置一些时间的处理程序。比如OnSignedIn ,OnSigningOut 等,默认是不做任何操作。 |
EventsType | Events的类型。 |
ExpireTimeSpan | 设置存储在 cookie 里面的认证票据的过期时间。服务端会验证加密的 ticket 的有效性。在设置了IsPersistent 之后也能在 Set-Cookie 头里面返回。默认的过期时间是14天。 |
LoginPath | HttpContext.ChallengeAsync 方法触发302跳转时候的地址。假设设置成/account/login ,比如当前访问/secure 返回401,那么会跳转地址/account/login?returnUrl=/secure ,当 login 页面生成一个新的登录身份之后,浏览器会跳转到 secure 页面。默认值是/Account/login |
LogoutPath | 登出地址。 |
ReturnUrlParameter | 登录或登出之后页面可以做一个跳转,这个跳转地址作为一个参数传过去,这个就用来设置这个参数的名字。 |
SessionStore | 用来保存跨站点请求的身份信息。设置了之后只有 session 的标识符会发送到客户端。当身份标识比较多的时候可以用。 |
SlidingExpiration | 滑动过期。标识一个有新的过期时间的新 cookie是否可以被动态的分发。可以在SignInAsync 方法里面使用AuthenticationProperties 。使用绝对的 cookie 有效期时间来增加应用的安全性。举个例子:```await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, |
创建一个认证 cookie
创建一个包含用户信息的 cookie需要构造一个ClaimsPrincipal。用户信息会被序列化然后保存在cookie 里面。
用必要的 Claim来构造一个ClaimsIdentity,然后调用 SignInAsync
方法。
var claims = new List<Claim> { new Claim(ClaimTypes.Name, user.Email), new Claim("FullName", user.FullName), new Claim(ClaimTypes.Role, "Administrator"), }; var claimsIdentity = new ClaimsIdentity( claims, CookieAuthenticationDefaults.AuthenticationScheme); var authProperties = new AuthenticationProperties { //AllowRefresh = <bool>, // Refreshing the authentication session should be allowed. //ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(10), //cookie 的绝对过期时间,会覆盖ExpireTimeSpan的设置。 //IsPersistent = true, //表示 cookie 是否是持久化的以便它在不同的 request 之间传送。设置了ExpireTimeSpan或ExpiresUtc是必须的。 //IssuedUtc = <DateTimeOffset>, // 凭证认证的时间。 //RedirectUri = <string> //http 跳转的时候的路径。 }; await HttpContext.SignInAsync( CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity), authProperties);
部分知识转载于https://www.cnblogs.com/sheldon-lou/p/9545726.html
更多知识看官方文档https://docs.microsoft.com/zh-cn/aspnet/core/security/authentication/cookie?view=aspnetcore-2.1&tabs=aspnetcore2x