ASP.net核心认证cookie在Google Chrome中运行时未设置,当运行在开发模式下。

23
我在我的解决方案中有三个应用程序,全部构建在asp.net core 1 MVC 6中。
  • App 1是用于验证用户的MVC应用程序。
  • App 2是Angular SPA应用程序,是解决方案中的主要应用程序。
  • App 3是一个MVC Web API应用程序。
在应用程序3中,我有通常的asp.net核心SignInManager和UserManager代码(与您启动新的MVC 6模板时获得的相同代码 - 唯一不同的是,它在此处存在于我的Web API中)。登录/注销/注册等可通过我AccountController中的Web API方法公开。这允许我锁定Web API,因此仅对经过身份验证的请求进行处理(使用[Authorize]属性)。
当我调用AccountController中的“Login”方法时,如果登录成功,则返回带有以下名称的Set-Cookie指令:“.AspNet.Microsoft.AspNet.Identity.Application”(用于身份验证)
然后,登录应用程序将用户从App1转发到App2。然后允许执行所有后续对Web API(App3)的请求进行身份验证。注意:后续请求特别指的是,在App2中,Angular从Web服务请求数据。
所有这些都很好地运作 - 在IE中很好地运作。这就引出了我的问题,为什么在Chrome中不起作用?我看到来自Web API登录响应的“Set-Cookie”指令返回Chrome,但后续请求没有附加此Cookie。
我做错了什么?
注意: 我的登录方法的Http响应如下:
    HTTP/1.1 200 OK
        Cache-Control: no-cache
        Pragma: no-cache
        Content-Type: application/json; charset=utf-8
        Expires: -1
        Server: Kestrel
        Set-Cookie: .AspNet.Microsoft.AspNet.Identity.Application=CfDJ8FWIuvXs-TxKoIYE8259iAY52B_VZDPTTvYwZ-WAo8hhPCdLhmUfxNZD1wjxEt0sqqnZl6NomwHPNTNFkBxsq4cw_WkQYklnj_dK79wodIguLdPXAbKu6UbS6HKRBxFxjOKVAfIdyxZJ6xA2CtnR9nJC_CSg7v1vFSzgDEiSBso8D3aDNjzFk8
7oIJodC7WLVxWUqdUpjaGRCXqHTYjTwgL9DCihnajAlB921_oEPinUwIPP8g_ugCQmqbFq6kgQ-GwPTifBKRlbtwNsDwbetynl1gIqzELyjgEUAKgtpD9SX7FSjl1grxoGRjbPiXJe-k1SSdnUIHR7wYPkFpiis_c_P1pGkmSyeiDG-lf0xftTlXlnC3BWMbgXeWZn_hsDzbW_Tek3qiq_NB-T0IMGaJgjRnr5DARNcOACWbzwGvHFjsn7n0u7-UZOfzgQJ76d3ra-hjra
    -aNcHLgbfDef3TK6z_CKt2iIlnTkyEJXC-3OSGnfWDRvofvQ216UApEPiKoJxiCjWSvGAQCzvf9P1TtKuwAQVxfWz8pL077E-Wfc-4ybtrT6Ivz2VbdFng5Ze5IQ5YWfYYTpDhLSHGKnpFgxVf96f7JwoXlgRq0gs7yEWdWFZs6d18pw-El5sLJr7g; path=/; secure; httponly
        Access-Control-Allow-Origin: *
        X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcUm9iZXJ0XERlc2t0b3BcSEJFIE1hbmFnZXJcTUFJTlxCbHVlem9uZSBXZWJBcGlcc3JjXEJ6LkFwcGxpY2F0aW9uXEJ6LkFwcGxpY2F0aW9uLkFwaVx3d3dyb290XGFwaVxhY2NvdW50XExvZ2lu?=
        X-Powered-By: ASP.NET
        Date: Wed, 04 May 2016 10:39:57 GMT
        Content-Length: 16

这三个应用程序的托管域名是相同的吗? - janv8000
是的 - 指的是本地主机,然后每个应用程序有不同的端口。 - Rob McCabe
1
可能这就是问题所在,我找到了几个关于Chrome和本地主机的cookie的问题,请参考https://dev59.com/x2sz5IYBdhLWcg3wDzwA,https://dev59.com/pWs05IYBdhLWcg3wQvuq。 - janv8000
3个回答

22

嗨,我也遇到了这个问题。

虽然我的VS本地环境正常工作,我的用户可以登录,但在Chrome发布环境中却无法工作。

当我在预生产环境中使用IIS尝试一些自签名证书的东西时,出现了这个问题,通过配置绑定打开了https。之后我又回到了http。

您可以在Chrome中尝试以下方法:打开开发者工具,转到选项卡Application,在左侧窗格中选择Clear storage。 在右侧的图表下方单击Clear site data,即使使用情况显示未使用0字节也要清除。请务必执行此操作。

最后,我重新获得了具有登录功能的应用程序。

希望这会对某人有所帮助。


2
确认即使显示“已使用0字节”,它也能正常工作。你真的救了我的一天。 - Graham Meehan
1
对我也起作用。当我在 LocalHost 上运行“更好的处理 ASP.NET Core 授权方式”时(仅限 Chrome 浏览器),遇到了这个问题。+1 - Yogi
1
谢谢,我花了3个小时来调试一个本来运行良好的应用程序,你的帮助让我恢复了理智。 - Mudo
你救了我一命,兄弟。非常感谢你。 - Cem

13

在我的情况下,我们有一个C# ASP.NET Core 2.1 MVC应用程序,我在Google Chrome中启动时工作正常。但有一天它突然停止工作。

在Google Chrome开发者工具中,我看到以下内容:

首先,我注意到应用程序 -> Cookie AspNetCore.Session缺失了

其次,在控制台中,我注意到以下警告。

与位于http://myapplication.company.net/的资源相关联的Cookie设置为SameSite = None, 但没有Secure。因为Chrome现在仅传递标记为Secure的SameSite = None cookie。您可以在开发人员工具中查看Application> Storage> Cookies下的cookie, 并在https://www.chromestatus.com/feature/5633521622188032中查看更多详细信息。

我做了以下操作来解决它。

在我们的应用程序中,在Startup.cs中我像下面这样做:

public void ConfigureServices(IServiceCollection services)
{
  services.Configure<CookiePolicyOptions>(options =>
  {
     options.MinimumSameSitePolicy = SameSiteMode.None;
     
  });
}

我们进行了如下更改

public void ConfigureServices(IServiceCollection services)
{
  services.Configure<CookiePolicyOptions>(options =>
  {
     options.MinimumSameSitePolicy = SameSiteMode.Strict;
     
  });
}

它解决了这个问题。我还注意到现在在开发者工具中可以看到 Application -> Cookies .AspNetCore.Session。


1
这在我使用Asp.Net Core 3.1和最新版Chrome时发生了,与同源策略模式(SameSiteMode.Strict)完美配合,但Consent cookie出现了问题。 - Ilias.P
1
这种情况也发生在我身上,是在ASP.NET Core 3.1中使用Language Cookie时。我花了3-4个小时来尝试解决它,最终使用了这个配置才解决了问题。谢谢! - apostolov
在尝试弄清楚为什么在本地运行项目时Cookie可以工作,但在生产环境中却不起作用时,浪费了很多时间。这个配置挽救了一天,谢谢! - Tyler Edwards

1
我有同样的问题,在IE、Edge中可以工作,但在Chrome、Firefox和Opera中不行。
看起来是一个cookie大小的问题,我通过减少cookie中的数据来解决了这个问题。
请参考此链接了解大小限制:chrome cookie size limit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接