Asp.net核心持久身份验证 - 自定义Cookie身份验证

时间:2017-09-15 16:07:10

标签: asp.net-core asp.net-core-2.0

我试图获得持久连接,因此用户只需要使用一次密码。我已经使用过这个文档:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/cookie?tabs=aspnetcore2x但是用户在一段时间后仍然会断开连接。

await HttpContext.SignInAsync(
                    CookieAuthenticationDefaults.AuthenticationScheme,
                    principal,
                    new AuthenticationProperties
                    {
                        IsPersistent = true
                    });

如何才能获得真正持久的连接?

2 个答案:

答案 0 :(得分:1)

根据文档的说法,IsPersistent授予的持久性只是意味着认证将通过浏览会话持续存在(即,即使在浏览器关闭时也会保留)。您需要Persistence 的组合来设置Cookie的到期时间。可以使用 ExpireTimeSpan 选项通过CookieAuthenticationOptions (MSDN)设置Cookie的到期时间。

如果没有持久性,可以使用AuthenticationOptions中的 ExpiresUtc 选项设置身份验证的到期时间,

答案 1 :(得分:0)

实施持久性cookie身份验证时,您应该注意的几点。

在Startup.cs中为cookie配置滑动到期时间。如果您显式设置所需的值并且不使用默认设置,将会更加清楚。

private void ConfigureAuthentication(IServiceCollection services)
{
    services
        .AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(options =>
        {                 
            // true by default   
            options.SlidingExpiration = true;

            // 14 days by default
            options.ExpireTimeSpan = TimeSpan.FromMinutes(20);
        });
}

当用户选中标志“记住我”时,将cookie配置为在浏览器会话中持久存在并设置绝对到期时间(只要您愿意)。此设置将覆盖SlidingExpiration和ExpireTimeSpan。在登录操作中:

List<Claim> claims = new List<Claim>();
// Prepare user claims...
                
var userIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
ClaimsPrincipal principal = new ClaimsPrincipal(userIdentity);

AuthenticationProperties authenticationProperties = new AuthenticationProperties() { IsPersistent = model.RememberMe };
if (model.RememberMe)
{
    // One month for example
    authenticationProperties.ExpiresUtc = DateTimeOffset.UtcNow.AddMonths(1);
}

await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal, authenticationProperties);

配置数据保护。在旧的经典asp.net网络表单中记​​住machineKey。否则,将在每个IIS应用程序池重新启动后重置cookie。您应该在Startup.cs中进行身份验证之前配置数据保护。要将密钥存储在应用程序的根文件夹中:

private void ConfigureDataProtection(IServiceCollection services, IWebHostEnvironment environment)
{
    var keysDirectoryName = "Keys";
    var keysDirectoryPath = Path.Combine(environment.ContentRootPath, keysDirectoryName);
    if (!Directory.Exists(keysDirectoryPath))
    {
        Directory.CreateDirectory(keysDirectoryPath);
    }
    services.AddDataProtection()
          .PersistKeysToFileSystem(new DirectoryInfo(keysDirectoryPath))
          .SetApplicationName("YourApplicationName");
}

来自文档: