【发布时间】:2020-10-15 01:41:39
【问题描述】:
我有一个 Angular 8 项目,它调用 Web API 来登录。 Web API 项目是使用 .Net Framework 4.8 构建的,并且托管在不同的域中。为了解决 CORS,我在 Web.Config 文件(在 system.webServer 区域)中有以下内容:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*"/>
<add name="Access-Control-Allow-Credentials" value="true"/>
<add name="Access-Control-Allow-Headers" value="Host, Connection, Accept-Encoding, User-Agent, Referer, Authorization, Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, X-Auth-Token, If-None-Match, Accept-Language, _headersMap, withcredentials"/>
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS, HEAD"/>
</customHeaders>
</httpProtocol>
我还在 web.config 文件的 system.web 区域中指定了 Forms 身份验证,并指定 SameSite cookie 值为“None”,因此 Angular 站点可以将 cookie 传递给 Web API 站点,就像这样:
<authentication mode="Forms">
<forms cookieSameSite="None" requireSSL="true" timeout="50000000" slidingExpiration="true" />
</authentication>
在我的登录方法中,如果登录成功,我会调用 FormsAuthentication.SetAuthCookie:
[HttpPost]
[Route("api/LaborLevel/Login")]
[ResponseType(typeof(LoginDto))]
public async Task<IHttpActionResult> Login(LoginDto loginDto)
{
if (!ModelState.IsValid)
return BadRequest(ModelState);
try
{
var login = await dataSvc.Login(loginDto);
if (login.Success == true)
{
// set auth ticket
FormsAuthentication.SetAuthCookie(login.EmployeeNbr, true);
}
return Ok(login);
}
catch (Exception ex)
{
return HandleError(ex);
}
}
在 Visual Studio 2019 中运行解决方案,当我查看 Chrome 的网络选项卡中的登录调用时,我看到响应 Cookies 集合包含一个名为“.ASPXAUTH”的 cookie,正如预期的那样:
但是,当我在调用登录方法后查看保存到我的网络浏览器的 cookie 时,我没有看到任何 .ASPXAUTH cookie 保存。当我随后尝试调用使用 [Authorize] 属性注释的 Web API 方法时,我收到 401 access denied 错误。
在我的 Angular 应用程序中,我在 HttpClient 的 post 方法中使用的 httpHeaders 集合中设置 withCredentials = true,但由于 cookie 从未保存到我的浏览器中,所以我看不出它有什么好处.
我做错了什么?如何将 cookie 保存到浏览器并在后续调用时传递给 Web API?
【问题讨论】:
-
能否请您edit 将原始回复分享为文本而不是屏幕截图?请参阅Discourage screenshots of code and/or errors 了解原因。话虽如此,您在
2020-06-24 17:50:53Z上发布了您的问题,并且显示的图像显示Expires / Max-Age 2020-06-24T17:50:34.000Z,即在您发布问题前19 秒。 cookie 在到达时会过期吗?或者,您是否可以在浏览器中阻止 cookie? -
响应为json对象,不包含cookie信息。我不知道如何在响应中查看 cookie 的原始文本 - 如果你能告诉我如何,我会的。
-
关于过期时间的(有趣)点,我更改了 web.config 文件以指定较大的超时,因此过期时间现在是 2115 年,但仍然没有变化。没有 cookie 保存到浏览器,并且调用测试安全方法失败并出现 401。(我已经用这些更改更新了问题。)
-
(并且 cookie 在浏览器中没有被阻止 - 我得到了很多,只是没有这个。)
标签: c# asp.net angular cookies forms-authentication