Cookie 身份验证在 ASP.NET Core 应用程序中不起作用

Posted

技术标签:

【中文标题】Cookie 身份验证在 ASP.NET Core 应用程序中不起作用【英文标题】:Cookie authentication is not working in ASP.NET Core application 【发布时间】:2020-06-20 04:23:54 【问题描述】:

我正在尝试在 .NET Core 3.1 中开发一个项目。我正在尝试在我的项目中实现基于 cookie 的身份验证。我的登录功能是:

[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();
    

为了实现基于 cookie 的身份验证,我将以下代码放在 Startup 类的 ConfigureService 方法中:

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);

而Startup类的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?");
    );

但问题是每次我尝试登录时,登录操作方法的以下代码都会出现以下异常。

等待 HttpContext.SignInAsync(IdentityConstants.ApplicationScheme, 校长)

发生的异常如下:

InvalidOperationException:没有登录身份验证处理程序 注册方案“Identity.Application”。注册的 登录方案是: Cookie。你忘记打电话了吗 AddAuthentication().AddCookies("Identity.Application",...)? Microsoft.AspNetCore.Authentication.AuthenticationService.SignInAsync(HttpContext 上下文、字符串方案、ClaimsPrincipal 主体、 AuthenticationProperties 属性) AccountController.cs 中的_01_AuthenticationDemo.Controllers.AccountController.Login(UserLoginModel userModel) + 等待 HttpContext.SignInAsync(IdentityConstants.ApplicationScheme, 校长);

谁能给我建议来解决这个问题。

【问题讨论】:

本题是第一个有可行解的题 【参考方案1】:

没有为方案“Identity.Application”注册登录身份验证处理程序。注册的登录方案有: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-cookie

测试结果

【讨论】:

【参考方案2】:

我会在此处留下此评论,以防它对任何人有所帮助。

我花了 2 天时间尝试获取 cookie 身份验证,然后在我的 .NET Core 3.1 站点上运行了一个基本的会话身份验证登录页面。

原来问题是我的广告平台 (Ezoic) 导致了这个问题。他们基本上使用某种代理系统,请求发送到他们的服务器,然后他们的服务器向我的服务器发出请求(反向代理?)。无论如何,如果您使用的是 CDN 或广告服务器或类似的东西,那么这可能是个问题。

我的另一个线索是我的网站在 localhost 上运行良好,但在生产服务器上却不行。

为了解决这个问题,广告公司说我可以在我的网站上添加一个 X-Forwarded-For 标头,但我无法让它工作,尽管遵循了关于向 Startup.cs 添加适当行的说明.

【讨论】:

以上是关于Cookie 身份验证在 ASP.NET Core 应用程序中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 使用Cookie验证身份

ASP.NET Core 身份验证 cookie 只收到一次

如何手动解密 ASP.NET Core 身份验证 cookie?

Cookie 身份验证在 ASP.NET Core 应用程序中不起作用

ASP.NET Core 5 OpenIdConnect 身份验证 cookie 在理论上是如何工作的?

如何使 ASP.NET Core 中的身份验证 cookie 无效?