Основные данные ASP.Net в билете аутентификации

c# asp.net-core asp.net-core-mvc

2459 просмотра

1 ответ

6939 Репутация автора

Какова лучшая практика в ядре ASP.Net для сохранения пользовательского билета аутентификации?
Другими словами, как достичь следующего с точки зрения MVC 6:

    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);
    }
Автор: Maxim Источник Размещён: 18.07.2016 11:46

Ответы (1)


0 плюса

6939 Репутация автора

В классе Startup в методе 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();
}
Автор: Maxim Размещён: 25.02.2017 06:26
Вопросы из категории :
32x32