【问题标题】:ASP.NET MVC Website Partial SSL Authentication cookie not submitted in requestASP.NET MVC 网站部分 SSL 身份验证 cookie 未在请求中提交
【发布时间】:2013-11-03 12:50:51
【问题描述】:

我正在尝试制作一个可以使用 http 和 https 的网站的 POC。所以我在我的母版页中有一个控件,如果用户经过身份验证,它需要信息。为此,我想使用HttpContext.Current.User.Identity.IsAuthenticated。 If is authenticated 显示经过身份验证的用户的信息,如果没有显示登录控件。

要对控件进行身份验证,请向具有[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 in action 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从服务器发出时的路径。如果可能,将 cookie 响应标头添加到您的问题中。
  • @user1429080 添加了响应标头
  • 那么 cookie 的路径设置为 /,所以大概问题出在域上。有关影响 cookie 域的讨论,请参阅此问题和相应答案:link
  • 您的所有请求都在端口 44300 上进行吗?还是“正常”请求超过 80 个?

标签: asp.net asp.net-mvc cookies ssl https


【解决方案1】:

可能是当你设置 auth cookie 时,它​​被标记为“安全”。

使用 Chrome 开发者工具,点击“资源”,然后点击 cookie。在“安全”列下检查 cookie 是否被标记。如果是,那么这意味着浏览器不会使用非安全连接发送 auth cookie。

【讨论】:

  • 我已经检查过了。 AJAX 响应标头中的 cookie .ASPXAUTH 具有 Secure = false 和 HttpOnly = false。但是我在 Chrome 开发者工具中做了你建议确定。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    一切都像 JS 以 HTTPS 方式发出的 ajax 请求一样完美。相关响应也可以正常工作。但是好像你也没有在 SSL 中准备登录页面!我的意思是:

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

    然后将请求发送到启用了 HttpPost 的操作。我相信这会正常工作。除非您在 ViewEngine(可能是 Razor)使用正式的 Microsoft ajax 表单的情况下缺少 MicrosoftMvcAjax.jsMicrosoftAjax.js 之类的要求。我认为学习this Article可以帮助你更多。

    祝你好运。

    【讨论】:

      猜你喜欢
      • 2011-02-28
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 2016-05-30
      • 2023-04-01
      • 2014-10-12
      • 1970-01-01
      相关资源
      最近更新 更多