Проверка подлинности Cook ie не работает в ASP. NET Базовом приложении - PullRequest
1 голос
/ 07 марта 2020

Я пытаюсь разработать проект в. NET Core 3.1. Я пытаюсь реализовать аутентификацию на основе cook ie в моем проекте. Моя функция входа в систему:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(UserLoginModel userModel)
{
    if (!ModelState.IsValid)
    {
        return View(userModel);
    }

    if (userModel.Email == "admin@test.com" && userModel.Password == "123")
    {
        var identity = new ClaimsIdentity(IdentityConstants.ApplicationScheme);
        identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, "User Id"));
        identity.AddClaim(new Claim(ClaimTypes.Name, "User Name"));

        var principal = new ClaimsPrincipal(identity);

        await HttpContext.SignInAsync(IdentityConstants.ApplicationScheme, principal);

        return RedirectToAction(nameof(HomeController.Index), "Home");
    }
    else
    {
        ModelState.AddModelError("", "Invalid UserName or Password");
        return View();
    }
}

Для реализации аутентификации на основе cook ie я поместил следующий код в мой метод ConfigureService класса Startup:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();

    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.  
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(options =>
        {
            options.Cookie.Name = "_auth";
            options.Cookie.HttpOnly = true;
            options.LoginPath = new PathString("/account/login");
            options.LogoutPath = new PathString("/account/logout");
            options.AccessDeniedPath = new PathString("/account/login");
            options.ExpireTimeSpan = TimeSpan.FromDays(1);
            options.SlidingExpiration = false;
        });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Latest);
}

И метод configure для Класс запуска:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseStaticFiles();
    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}

Но проблема заключается в том, что каждый раз, когда я пытаюсь войти в систему, в приведенном ниже коде метода действия входа возникает следующее исключение:

await HttpContext.SignInAsyn c (IdentityConstants.ApplicationScheme, принципал)

Произошло исключение, приведенное ниже:

InvalidOperationException: для схемы «Идентификация» не зарегистрирован обработчик аутентификации при входе в систему. Заявка'. Зарегистрированные схемы входа: Cookies. Вы забыли вызвать AddAuthentication (). AddCookies ("Identity.Application", ...)? Microsoft.AspNetCore.Authentication.AuthenticationService.SignInAsyn c (контекст HttpContext, строковая схема, принцип ClaimsPrincipal, свойства AuthenticationProperties) _01_AuthenticationDemo.Controllers.AccountController.Login * пользовательский логин класса пользовательского интерфейса (username) класса пользовательского интерфейса (UserLog). .ApplicationScheme, Principal);

Может кто-нибудь дать мне предложение решить проблему.

1 Ответ

1 голос
/ 09 марта 2020

Для схемы «Идентификация. Приложение» не зарегистрирован обработчик аутентификации при входе. Зарегистрированные схемы входа: Cookies.

Пожалуйста, разделите его на CookieAuthenticationDefaults.AuthenticationScheme, как показано ниже.

if (userModel.Email == "admin@test.com" && userModel.Password == "123")
{
    var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
    identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, "User Id"));
    identity.AddClaim(new Claim(ClaimTypes.Name, "User Name"));

    var principal = new ClaimsPrincipal(identity);

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

    return RedirectToAction(nameof(HomeController.Index), "Home");
}

Для получения дополнительной информации, пожалуйста, проверьте: https://docs.microsoft.com/en-us/aspnet/core/security/authentication/cookie?view=aspnetcore-3.1#create -an-authentication-cook ie

Результат теста

enter image description here

...