Asp.net core 为什么Microsoft Identity/AuthorizeFilter会破坏Cookie?
我在我的ASP.NET核心应用程序中看到cookies的行为在添加授权过滤器的基础上发生了变化,我不知道为什么 我会尽量简明扼要地解释。我创建了一个示例应用程序来说明这一点 在测试应用程序的my HomeController的Index()中,我有以下代码,它设置了一个http cookie,然后重定向到TestController的Index()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
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();