我的 webapi 中有一个用户信息端点,它受[Authorize]
cookie 身份验证保护。如果指定的 cookie 不存在,则用户将被重定向到/account/login
,如下所示。
var WindowsAuthenticationSchemeName = Microsoft.AspNetCore.Server.IISIntegration.IISDefaults.AuthenticationScheme;
try
{
var result = await HttpContext.AuthenticateAsync(WindowsAuthenticationSchemeName);
if (!(result?.Principal is WindowsPrincipal wp)) { throw new InvalidCredentialException("Expected windows principal"); }
var claims = Build_Claim_Set_Here;
var id = new ClaimsIdentity(claims, WindowsAuthenticationSchemeName);
await HttpContext.SignInAsync(new ClaimsPrincipal(id));
return Redirect(returnUrl);
}
catch (Exception ex)
{
return Challenge(WindowsAuthenticationSchemeName);
}
请注意,我没有在SignInAsync
请求中指定任何方案名称。由于我的默认身份验证方案是 cookie 方案,我希望在此处使用它。之后重定向响应被发送到浏览器(在这种情况下,returnUrl
将是用户信息端点。Windows 身份验证(在浏览器中带有提示),并且重定向到用户信息端点工作得很好。
问题是发送到浏览器的 cookie 没有保存在浏览器中,因此没有与后续请求一起发送。存储在 cookie 中的声明对于用户信息端点是必不可少的。请注意,cookie 在浏览器的响应头中可见,并且大小远低于 4096 字节,这通常是 cookie 大小的上限。因此,我不清楚为什么浏览器不保存 cookie。
有什么我想念的吗?
更新:我的错,原来是域名拼写错误。由于 cookie 是同站点 cookie,cookie 既不会为应用程序保存,也不会随后续请求一起发送。