2010-02-24 60 views
4

我有一个使用Forms身份验证的ASP.NET网站访问ASP.NET身份验证票证上的客户端(通过JavaScript)

<authentication mode="Forms"> 
     <forms name="NewsCoreAuthentication" loginUrl="~/Default.aspx" defaultUrl="~/Default.aspx" protection="Validation" timeout="300" domain="someRootDomain.com" /> 
    </authentication> 

我需要确定用户是否被网页上证实了它被呈现到客户端后, 。 为了达到这个目的,我认为我可以阅读document.cookie并检查是否存在“.ASPXAUTH”。 但问题是,即使我在这个值签名是

如何检查用户是否已通过身份验证? 为什么document.cookie是空的?


谢谢你的答案。 blowdart帮助我理解了为什么身份验证票据无法从客户端脚本访问。

+0

@pavlo,你可以从客户端进行检查。有一种机制专门设计我的MS来完成客户端脚本。它干净而快速,没有磁盘活动,它只是为你读取cookie并返回一个布尔值。在放弃之前看到我的答案。 – 2010-03-01 17:35:24

回答

5

它是空白的原因是因为cookie被标记为HttpOnly。这意味着它不能通过脚本访问。把它关掉是一个非常糟糕的主意,因为你的网站中的XSS漏洞可能使它暴露在cookie被盗的情况下,所以我不会告诉你如何做到这一点。

+0

谢谢,你说得对。 此答案帮助了我。 我可以为自己添加一个标志来识别用户是否已通过身份验证。 – 2010-02-25 06:46:06

+1

有趣的是,没有人提到cookie名称应该是'NewsCoreAuthentication',而不是'.ASPXAUTH',尽管这与启用HttpOnly标志无关,我想。 – 2014-08-04 00:39:44

0

第一......这是一个坏主意。检查用户是否在客户端获得授权绝对没有安全性。没有。

但是,如果你真的想这样做...做代码后面的检查,并将值推送到可以通过Javascript读取的客户端。类似于:

RegisterClientScript(“isvalidated”,“var isUserAuthenticated =”+ UserAuthenticated);

您现在看到问题了吗?你可以在AJAX中做同样的事情......但它有同样的问题。

好吧,我可以看到这样做是为了简单方便用户...显示某些链接,如果他们被授权例如。但在任何形式或形式上都不安全。只需要帮你一个忙,并在代码隐藏中处理这个问题。

+0

一个很好的评论和建议,但我需要在客户端进行此检查的原因是因为页面仅由IIS(htm和html)处理。 AJAX是一个好主意,但由于网站的负载很高,我无法负担调用ASP.NET页面(或处理程序)。 检查后,我会在IFRAME中显示一些安全的页面。所以cookie中的这个标志不会导致安全问题。谢谢你的答案! – 2010-02-25 07:06:06

1

正如其他人所说,认证机票是应该的,并且应该是安全的。

执行此操作的最佳方法是使用ApplicationServices。 JSON身份验证端点公开了IsLoggedIn,并且我注意到您对服务器负载的担忧。对静态端点的调用的开销可以忽略不计。真。

所以,如果您使用MsAjax,只需启用应用程序服务并调用Sys.Services.AuthenticationService.IsLoggedIn。

如果你想在这里从原材料的javascript做到这一点是codez ;-)

这部分添加到您的配置文件

<system.web> 
    ------------ 
    </system.web> 
    <system.web.extensions> 
    <scripting> 
     <webServices> 
     <authenticationService enabled ="true" requireSSL="false"/> 
     </webServices> 
    </scripting> 
    </system.web.extensions> 

页....

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title></title> 

    <script type="text/javascript"> 
     function createXHR() { 
      // a memoizing XMLHttpRequest factory. 
      var xhr; 
      var factories = [ 
        function() { return new XMLHttpRequest(); }, 
        function() { return new ActiveXObject("Msxml2.XMLHTTP"); }, 
        function() { return new ActiveXObject("Msxml3.XMLHTTP"); }, 
        function() { return new ActiveXObject("Microsoft.XMLHTTP"); } ]; 
      for (var i = 0; i < factories.length; i++) { 
       try { 
        xhr = factories[i](); 
        // memoize the factory so we don't have to look for it again. 
        createXHR = factories[i]; 
        return xhr; 
       } catch (e) { } 
      } 
     } 

     function isLoggedIn() { 
      var xhr = createXHR(); 
      xhr.open("POST", "/Authentication_JSON_AppService.axd/IsLoggedIn", true); 
      xhr.onreadystatechange = function() { 
       if (this.readyState === 4) { 
        if (this.status != 200) { 
         alert(xhr.statusText); 
        } else { 
         alert("IsLoggedIn = " + xhr.responseText); 
        } 
        xhr = null; 
       } 
      }; 
      xhr.setRequestHeader("content-type", "application/json"); 
      xhr.send(null); 
     } 
    </script> 

</head> 
<body> 
    <input type="button" value="IsLoggedIn?" onclick="isLoggedIn()" /> 
</body> 
</html> 
相关问题