asp.net core2 mvc 基础教程--cookie 身份认证

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需要构造一个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

posted @ 2020-06-29 22:41  学做flutter的小菜鸡  阅读(198)  评论(0编辑  收藏  举报