2016-07-18 20 views
1

カスタム認証チケットを保存するためのASP.Netコアのベストプラクティスは何ですか?
MVC 6の観点から、以下を達成するためにどのように言い換えれば :スタートアップクラスで認証チケットのASP.Netコアカスタムデータ

public static void SignIn(string username, bool persistent, long accountId) 
    { 
     const int version = 1; 
     DateTime issue = DateTime.Now; 
     DateTime expiration = issue.AddMonths(1); 
     string data = accountId.ToString(); 

     FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(version, username, issue, expiration, persistent, data); 
     HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket)); 

     if (persistent == true) 
      cookie.Expires = expiration; 

     HttpContext.Current.Response.Cookies.Add(cookie); 
    } 
+1

を見てくださいhttps://docs.asp.net/en/latest/security/authentication/cookie.html –

答えて

0

configureメソッドでIApplicationBuilderアプリケーション使用:

application.CustomCookieAuthentication(login); 

をそれはあなた自身のコードに応じて、いくつかの調整が必要となります。一部のクラスメソッドは、設定に応じて独自のクラスメソッドに置き換える必要があります。しかし、一般的な解決策で私は思う:

public static IApplicationBuilder CustomCookieAuthentication(this IApplicationBuilder application, string url) 
{ 
    if (application == null) 
     throw new ArgumentNullException(nameof(application)); 

    if (url == null) 
     throw new ArgumentNullException(nameof(url)); 

    IApplicationBuilder chain = application.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     CookieName = SecurityExtensions.CookieName, 
     CookieHttpOnly = true, 
     CookieSecure = Configuration.Authentication.Cookie.Secure, 
     ExpireTimeSpan = TimeSpan.FromDays(30), 
     SlidingExpiration = true, 
     AutomaticAuthenticate = true, 
     AutomaticChallenge = true, 
     LoginPath = new PathString(url), 
     AccessDeniedPath = new PathString(url) 
    }); 

    return chain; 
} 

public static async Task Login(this HttpContext context, string username, Unique accountId, bool persistent) 
{ 
    await context.Logout(); 

    Claim id = new Claim(ClaimTypes.UserData, accountId.ToString()); 
    Claim version = new Claim(ClaimTypes.Version, SecurityExtensions.Version.ToString()); 
    ClaimsPrincipal principal = new ClaimsPrincipal(new ClaimsIdentity(new[] { id, version }, SecurityExtensions.CookieName)); 

    DateTime utc = DateTime.UtcNow; 

    AuthenticationProperties properties = new AuthenticationProperties(); 
    properties.IssuedUtc = utc; 
    properties.IsPersistent = persistent; 

    if (persistent == true) 
     properties.ExpiresUtc = utc.AddYears(1); 

    await context.Authentication.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal, properties); 
} 

public static async Task Logout(this HttpContext context) 
{ 
    await context.Authentication.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme); 

    ISession session = SecurityExtensions.GetSession(context); 
    session?.Clear(); 
} 
関連する問題