ASP.NET Core — Написание простой аутентификации cookie-файлов

Вот краткое руководство по написанию аутентификации cookie без использования ASP.NET Identity.

  1. Добавьте службу аутентификации и HttpContextAccessor.

    builder.Services.AddAuthentication("MyAuthScheme")
        .AddCookie("MyAuthScheme", options => {
            options.LoginPath = "/Login";
            options.LogoutPath = "/Logout";        
            options.AccessDeniedPath = "/AccessDenied";
        });
    
    builder.Services.AddHttpContextAccessor();
    

    Обратите внимание, что "MyAuthScheme" будет использоваться везде.

  2. Настройте конвейер HTTP-запросов.

    app.UseAuthentication();
    app.UseAuthorization();
    
    app.MapRazorPages();
    app.MapControllers();
    
  3. На странице входа в систему добавьте:

    using Microsoft.AspNetCore.Authentication;
    using Microsoft.AspNetCore.Authorization;
    using System.Security.Claims;
    

    В конструкторе страницы входа в систему инжектируйте _httpContextAccessor следующим образом:

    private readonly IHttpContextAccessor _httpContextAccessor;
    public Login(IHttpContextAccessor httpContextAccessor){ 
        _httpContextAccessor = httpContextAccessor;
    }
    

    Фактический вход в систему:

    // Validate login credentials here and get user details.
    
    var claims = new List<Claim>
    {
        new Claim(ClaimTypes.NameIdentifier, user.Id),
        new Claim(ClaimTypes.Name, user.Username),
        new Claim(ClaimTypes.Email, user.Email)
        // add or remove claims as necessary    
    };
    
    var claimsIdentity = new ClaimsIdentity(claims, "MyAuthScheme");
    
    await _httpContextAccessor.HttpContext
        .SignInAsync("MyAuthScheme",
            new ClaimsPrincipal(claimsIdentity),
            new AuthenticationProperties());
    
    // Redirect here
    

    Этот код создает cookie с именем .AspNetCore.MyAuthScheme.

  4. Коды выхода из системы:

    await _httpContextAccessor.HttpContext
                .SignOutAsync("MyAuthScheme");
    
    // Redirect to login or other page
    

    Этот код удаляет cookie .AspNetCore.MyAuthScheme.

  5. Теперь вы можете поместить [Authorize] на свои страницы, требующие авторизованных пользователей. Для проверки вручную или для доступа к утверждениям на странице Controller или Razor:

    if(User.Identity.IsAuthenticated) {
    
        var username = User.Identity.Name;
        var email = User.Claims.Where(i => i.Type == "Email").FirstOrDefault().Value;
    }
    

    Для доступа в .cshtml:

    @if(User.Identity.IsAuthenticated) {
        <p>@User.Identity.Name</p>
        <p>@User.Claims.Where(i => i.Type == "Email").FirstOrDefault().Value</p>
    }
    

    В других частях сайта внедрите IHttpContextAccessor:

    if(_httpContextAccessor.HttpContext
        .User.Identity.IsAuthenticated) {
        //do something
    }
    

Ресурс

Документы Microsoft

Оцените статью
devanswers.ru
Добавить комментарий