ASP.NET MVC 网站部分 SSL 身份验证 cookie 未在请求中提交



我正在尝试制作一个POC,其中可以拥有一个使用http和https的网站。因此,我的母版页中有一个控件,该控件需要用户是否经过身份验证的信息。为此,我想使用HttpContext.Current.User.Identity.IsAuthenticated.如果经过身份验证,则显示经过身份验证的用户的信息,如果未显示登录控件。

若要对控件进行身份验证,请向具有 [RequireHttps] 属性的登录操作发出 AJAX POST 请求。AJAX 请求中使用的 URL 是:

$.ajax({
    type: 'POST',
    url: '@Url.Action("ModalLogIn", "Authentication", null, "https", Request.Url.Host + ":44300")',

顺便说一下,我正在使用启用了SSL的VS2013 IIS express。

正如您在我的 AJAX 请求中看到的那样,我正在使用 HTTPS 在操作 url。使用 SSL 向服务器发出请求,并成功做出响应。

问题是在后续请求中,ASPXAUTH cookie 不会在请求标头中传递。因此,服务器不会获取用户身份验证信息。后续请求不使用SSL,是简单的HTTP请求。

我知道在安全方面,身份验证仍然是不安全的,因为我希望通过HTTP传递ASPXAUTH,但就像我说的是一个POC,我想看看是否可以使用HTTPS发出简单的身份验证请求,而所有其他使用HTTP

根据要求,这是响应标头:

Access-Control-Allow-Orig...    *
Cache-Control   private
Content-Length  15
Content-Type    application/json; charset=utf-8
Date    Sat, 26 Oct 2013 18:57:55 GMT
Server  Microsoft-IIS/8.0
Set-Cookie  ASP.NET_SessionId=j2a53htev0fjp1qq4bnoeo0l; path=/; HttpOnly 
ASP.NET_SessionId=j2a53htev0fjp1qq4bnoeo0l; path=/; HttpOnly 
IAC.CurrentLanguage=en; expires=Sun, 26-Oct-2014 19:57:55 GMT; path=/ 
.ASPXAUTH=730DEDBFD2DF873A5F2BD581AA0E25B685CAD12C26AEA63AD82484C932E26B617687A05BB403216CC5EFCF799970810059F9CA2CF829F953580AF81FF48102003C0129AB04424F0D011A733CAAF1DE00688E5A4C93DEA97338DD2B5E7EE752F3761A470D52449BEBCA74098912DE37AA8C1E293B1C5D44EB1F9E9384DAAEF289; path=/; HttpOnly
    X-AspNet-Version    4.0.30319
    X-AspNetMvc-Version 3.0
X-Powered-By    ASP.NET
X-SourceFiles   =?UTF-8?B?QzpcTXkgRGF0YVxCaXRidWNrZXRcaWFjLXdlYnNpdGVcaW1wbGVtZW50YXRpb25cZG90bmV0XElBQy5XZWJcQXV0aGVudGljYXRpb25cTW9kYWxMb2dJbg==?=

可能是当您设置身份验证cookie时,它被标记为"安全"。

使用 Chrome 开发者工具,点击"资源",然后点击 Cookie。在"安全"列下,检查cookie是否已标记。如果是,则意味着浏览器不会使用非安全连接发送身份验证cookie。

只是在黑暗中拍摄,但请尝试将ASPXAUTH cookie设置为到期日期。

浏览器在收到会话 Cookie 后,可能只会在使用与设置时相同的协议 (https) 的连接上显示会话 Cookie。 我确信持久性 cookie 没有此限制。

此外,调查端口是否可能是问题所在。 如果您的 AJAX 超过 44300,而您的网站超过 80 或 443,则 Cookie 可能会丢失,因为浏览器认为安全 cookie 是特定于端口的。 W3C 规范没有说明 cookie 在端口方面是否是私有的;浏览器各不相同。

所有的事情都完美地工作,就像 JS 以 HTTPS 方式的 ajax 请求一样。相关响应也可以正常工作。但是您似乎也没有在SSL中准备登录页面!我的意思是:

[RequireHttps]
public ActionResult Login()
{
   return View();
}

然后将请求发送到启用 HttpPost 的操作。我相信这将正常工作。除非你缺乏一些要求,如MicrosoftMvcAjax.jsMicrosoftAjax.js,因为你正在使用正式的Microsoft ajax形式由你的ViewEngine(也许通过Razor)。我认为学习这篇文章可以对你有更多帮助。

祝你好运。

最新更新