IE VS Chrome 和 Firefox 中的网络安全(错误)

Posted

技术标签:

【中文标题】IE VS Chrome 和 Firefox 中的网络安全(错误)【英文标题】:Web Security in IE VS Chrome & Firefox (bug) 【发布时间】:2014-06-16 16:22:01 【问题描述】:

为什么网络安全在不同浏览器上的工作方式不同:

详情:

我有两个应用程序

一个是简单的html 应用程序,另一个是ASP.NET MVC4 WebApi 应用程序,项目在同一个解决方案中,我设置了多个启动项目以同时运行应用程序。


工作版本:

我在 Web API 项目中使用了 Web Security。我已经全面实施了网络安全......

登录操作代码

// GET api/company
[System.Web.Http.AcceptVerbs("Post")]
[System.Web.Http.HttpPost]
public HttpResponseMessage Login(LoginRequest loginRequest)

    try
    
        if (WebSecurity.Login(loginRequest.EmailAddress, loginRequest.Password, true))
        
            var userDetails = new string[2];
            userDetails[0] = loginRequest.EmailAddress;
            var currentUSerRole = Roles.GetRolesForUser(loginRequest.EmailAddress);
            userDetails[1] = currentUSerRole[0].ToString();
            HttpResponseMessage response =
                Request.CreateResponse(HttpStatusCode.Accepted, userDetails);
            return response;
        
        else
        
            HttpResponseMessage response
                = Request.CreateResponse(HttpStatusCode.Unauthorized);
            return response;
        
    
    catch (Exception e)
    
            HttpResponseMessage response
            = Request.CreateResponse(HttpStatusCode.Unauthorized);
           return response;
      

当我使用Ajax 调用登录方法时,*WebSecurity.Login* 正在所有浏览器上工作。 但我在另一个控制器中有另一种方法,名为CurrentDateAndUser

代码:

[AllowAnonymous]
[System.Web.Http.AcceptVerbs("Get")]
[System.Web.Http.HttpGet]
public HttpResponseMessage CurrentDateAndUser()

    if (WebSecurity.IsAuthenticated)
    
        int userId = WebSecurity.CurrentUserId;
        string[] currentDateAndUSerId = new string[2];
        currentDateAndUSerId[0] = userId.ToString();
        currentDateAndUSerId[1] = DateTime.UtcNow.ToString();

        HttpResponseMessage response =
            Request.CreateResponse(HttpStatusCode.Accepted, currentDateAndUSerId);
        return response;
    
    HttpResponseMessage responseNew =
        Request.CreateResponse(HttpStatusCode.NotAcceptable);
    return responseNew;

问题:

如果我使用 Ajax 调用从 Microsoft Internet Explorer 调用 CurrentDateAndUser 方法,那么一切正常。 WebSecurity.IsAuthenticated 返回 true 并且运行良好。

然而

如果我使用 Ajax 调用从 Google Chrome 或 Mozilla Firefox 调用 CurrentDateAndUser 方法,则没有任何效果。 WebSecurity.IsAuthenticated 总是返回 false。

我不知道为什么。如果您有任何想法,请告诉我。


我也发现了一个类似的问题(不确定是不是真的问题):

当我使用 Fiddler 运行我的应用程序时,我看到了不同的结果:

当我从 IE 调用 CurrentDateAndUser 方法时,请求是:

我可以在上图中看到 Cooke/Login 值


但是当我从 Chrome 和 Firefox 调用 CurrentDateAndUser 方法时,请求是:

我看不到 cookie 值,这意味着 Web Security.IsAuthenticated 属性正在返回 false



WebSecurity中的Bug??????


编辑

我的 Ajax 请求代码是

function GetCurrentUserId()  
    return $.ajax(
        method: 'GET',
        url: rootUrl + '/api/Common/CurrentDateAndUser',
        async: false
    ).success(function (response) 
        return response[0];

    ).error(function () 
        toastr.error('Somthing is wrong', 'Error');
    )

当我在 Chrome 和 Firefox 中运行应用程序时,此请求不会将 Auth Cookie 值发送到 Web API 方法,但是,如果在 IE 中运行,此请求会将 cookie 值发送到 API 方法 em>

我已经发布了图片,请看上面的图片

【问题讨论】:

可能你只需要在第二种情况下发送 HttpStatusCode.Unauthorized 以使浏览器再次登录。 我也试过了。这是没有用的。我想我有任何 cors 问题,但我还没有得到解决方案。 f**King 问题.. 用 fiddler 调用你的应用程序,看看在 firefox 和 chrome 上会发生什么。你应该看到一个 401 代码。如果您收到 401 并且没有提示输入用户名,如果代码与 401 不同,则它是浏览器上的一个错误,您将覆盖响应。通常你应该看到两个 401,然后是 2** 或 3** 响应。 PS:我假设您将 CurrentDateAndUser 更改为使用 HttpStatusCode.Unauthorized 进行错误回复 为什么端口号不同(50949 vs 12345)?并查看此问题的答案(阅读他们对 IE 行为的看法):***.com/questions/1612177/… 【参考方案1】:

它周围有 3 件事:

WebSecurity.IsAuthenticated 实际上返回 HttpRequest.IsAuthenticated 的值,如果 Forms Authentication cookie 已设置并且是最新的,则返回 true。在用户成功登录后发出下一个请求之前它不可用,这就是您看到您描述的行为的原因。

我记得在 MSDN 或其他地方阅读过,WebSecurity.IsAuthenticated 在页面完全加载之前不起作用。这意味着如果您在页面中登录用户并且在您检查 IsAuthenticated 的同一代码流中,它将不会返回 True。要使 IsAuthenticated 为 True,必须重新加载页面或使用更好的做法;这是在登录成功后立即将用户重定向到另一个安全页面,并在该页面中检查 IsAuthenticated。

我们在使用 Chrome(版本 21.0.1180)时遇到了同样的问题。尽管我们在 Header 上看到了过期日期,但 Windows XP 中的一些 Chrome 忽略了它。然后我们删除了 Expiration Date 并且 Chrome 接受了保持会话 cookie 没有问题。

那么要做的是: 登录后尝试在新页面上检查此内容,而不是在同一页面上。

也尝试显式设置 cookie

System.Web.Security.FormsAuthentication.SetAuthCookie(user.Username, false);

【讨论】:

第一段来自asp.net网站,第二段来自这个堆栈溢出网站,第三段是支持chrome网站。我已经全部阅读了。我很想念你理解我的问题。我的问题是当我从 Chrome 和 FirFox 运行应用程序时,ajax 方法不发送身份验证 cookie。有道理吗? 谢谢!请再次查看我的问题,我已经编辑了我的问题。并解释一下 是域问题吗? \ 你试过不同的机器吗? 是的,我在不同的机器上试过。同样的问题。【参考方案2】:

问题根本不在于网络安全,而在于您实施安全性的方式。您绝不应该在 cookie 中使用用户 ID、电子邮件或任何重要的内容。

我建议您使用 FormsAuthentication 类来加密和解密您的 cookie,即使这样,也只存储诸如 SessionID 和该会话 ID 的自定义哈希值之类的内容,以便在您解密 cookie 时验证您自己

这是一个很好的例子:http://www.c-sharpcorner.com/uploadfile/nipuntomar/update-formsauthenticationticket/

【讨论】:

谢谢!请再看一次我的问题,我已经编辑了我的问题。并解释一下 +1 我同意你的回答。但这就是为什么要在 IE 中工作?但为什么它在 Chrome 和 FireFox 中不起作用? 我一直在环顾四周,但我不太清楚为什么 IE 会,而 Firefox/Chrome 不会。由于您在本地托管/调试,因此可能与允许更多访问权限的 IE 设置有关。尝试将其托管在远程站点上,看看 IE 是否仍然发送 cookie?这是另一个可能有帮助的链接:***.com/questions/7911710/… 我喜欢这个链接,我会试试的【参考方案3】:

我不知道这是否有帮助。

但我记得我正在学习 jQuery ajax 所以我在笔记本电脑上设置了一个简单的项目。当我测试它时,它在 IE 上运行良好,但在 Chrome 中失败了。搜索了几个小时后,我发现 Chrome 不允许来自本地机器的 AJAX 请求。当我使用实际的 Web 服务器对其进行测试时,它在 IE 和 Chrome 上运行良好。

所以我的问题和建议是:您是在同一台机器上进行测试吗? 尝试将其部署到运行具有唯一域名的 Web 服务器的机器上并测试您的应用程序!

【讨论】:

are u testing on the same machine??是的。我会试试那个家伙。 请部署到远程服务器并测试您的浏览器并给我们反馈 另外一个测试来证实这个假设,是尝试用任何不涉及安全的简单项目来测试 Ajax,看看浏览器在同一台机器上的响应方式,以及它们在真实网站上的响应方式

以上是关于IE VS Chrome 和 Firefox 中的网络安全(错误)的主要内容,如果未能解决你的问题,请参考以下文章

IE/Firefox 中的填充和/或边距与 Chrome 不同

Firefox 和 Opera/Chrome/IE 中的表单填充差异

firefox、ie和chrome的区别

从 ie/firefox/chrome 中的 jquery 调用跨域 .net 方法

使 Firefox 图像缩小类似于 Chrome 或 IE 中的结果

iframe 上的 onload 事件在 ie 和 firefox/google chrome 中的工作方式不同