Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 为什么Microsoft Identity/AuthorizeFilter会破坏Cookie?_Asp.net Core_Asp.net Identity_Asp.net Authorization_Httpcookie_Asp.net Authentication - Fatal编程技术网

Asp.net core 为什么Microsoft Identity/AuthorizeFilter会破坏Cookie?

Asp.net core 为什么Microsoft Identity/AuthorizeFilter会破坏Cookie?,asp.net-core,asp.net-identity,asp.net-authorization,httpcookie,asp.net-authentication,Asp.net Core,Asp.net Identity,Asp.net Authorization,Httpcookie,Asp.net Authentication,我在我的ASP.NET核心应用程序中看到cookies的行为在添加授权过滤器的基础上发生了变化,我不知道为什么 我会尽量简明扼要地解释。我创建了一个示例应用程序来说明这一点 在测试应用程序的my HomeController的Index()中,我有以下代码,它设置了一个http cookie,然后重定向到TestController的Index() public IActionResult Index() { CookieOptions option = new

我在我的ASP.NET核心应用程序中看到cookies的行为在添加授权过滤器的基础上发生了变化,我不知道为什么

我会尽量简明扼要地解释。我创建了一个示例应用程序来说明这一点

在测试应用程序的my HomeController的Index()中,我有以下代码,它设置了一个http cookie,然后重定向到TestController的Index()

    public IActionResult Index()
    {
        CookieOptions option = new CookieOptions
        {
            Expires = DateTime.Now.AddDays(3650),
            SameSite = SameSiteMode.Strict,
            Secure = false,
            HttpOnly = true
        };
        Response.Cookies.Append("TestCookie", "ZZZ", option);
        return RedirectToAction("Index", "Test");
    }
在“Test”视图中,它只显示TestCookie的值

 <h1>TestView</h1>
 <p>
     @Context.Request.Cookies["TestCookie"]
 </p>
这是创建项目时选择Microsoft标识时添加到Startup.cs的代码

现在,当我运行应用程序时,它在重定向到测试控制器后不会显示cookie的值。它是空的。为什么?

奇怪的是,Chrome显示它看到了cookie,但在服务器端看不到

如果我在HomeController的Index()上设置断点,它会执行设置cookie的代码

但是,在测试视图中输出cookie值的上一行CSHTML文件上的断点显示集合中只有一个cookie,“.AspNetCore.AzureADCookie”。我的饼干不在那里

如果我在浏览器中重新加载页面(不是刷新,而是再次点击URL),那么它会显示cookie值

如果我在Startup.cs中注释掉这段代码,它就会像我预期的那样工作-它会在视图中显示cookie的值:

        services.AddControllersWithViews(options =>
        {
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            options.Filters.Add(new AuthorizeFilter(policy));
        });
我将其替换为:

        services.AddControllersWithViews();
所有这些都按预期工作-因此,似乎添加了带有AuthorizeFilter()的策略,从而影响了这一点


为什么呢?为什么它没有保存cookie(或丢失)?

只是一个旁注,为什么在视图中使用
HttpContextAccessor.HttpContext
,您可以通过属性
Context
访问
HttpContext
?您应该改为使用该属性(当然,尝试一下,看看问题是否仍然存在)。使用访问器只是让我们怀疑它提供给我们的
HttpContext
的确切实例。@KingKing我只是从实际应用程序中复制代码,这就是它所使用的。我只是把它去掉,改为使用上下文-不会改变它的功能,但我明白你的观点,并将更新帖子。我建议你可以尝试在不使用AzureAD的情况下运行此应用程序。我在没有使用AzureAD的情况下直接使用默认标识测试了您的代码。它工作得很好,当应用程序登录到主页时,它可以显示cookie。@BrandoZhang是的,我知道-没有AzureAD它工作得很好。但是,我们的要求是通过Azure AD进行身份验证。我的问题是为什么Azure AD会影响这样的cookie?
        services.AddControllersWithViews();