代码之家  ›  专栏  ›  技术社区  ›  Pavlo Neiman

访问客户端上的ASP.NET身份验证票证(通过javascript)

  •  4
  • Pavlo Neiman  · 技术社区  · 14 年前

    我有一个使用窗体身份验证的ASP.NET网站

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

    我需要确定在将用户呈现给客户机之后,是否在网页上对其进行了身份验证。 为了做到这一点,我认为我可以阅读 曲奇饼 检查是否有“.aspxauth”。 但问题是即使我签了这个值, 空的 .

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


    谢谢你的回答。 喷气镖 帮助我理解为什么不能从客户端脚本访问身份验证票证。

    3 回复  |  直到 14 年前
        1
  •  5
  •   blowdart    14 年前

    它为空的原因是因为cookie被标记为httponly来保护。这意味着不能通过脚本访问它。关闭这是一个非常糟糕的主意,因为您的站点中的XSS漏洞可能会使它暴露在cookie盗窃中,所以我不会告诉您如何做到这一点。

        2
  •  1
  •   Sky Sanders    14 年前

    正如其他人所说,auth罚单是且应该是httponly。

    最好的方法是使用ApplicationServices。JSON身份验证端点公开了isloggedin,我注意到了您对服务器负载的关注。调用只为您检查cookie的静态端点的开销可以忽略不计。真正地。

    因此,如果您使用的是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>
    
        3
  •  0
  •   Bryan    14 年前

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

    但如果你真的想这么做…执行后面的签入代码,并向客户机推送一个可以通过javascript读取的值。类似于:

    registerClientScript(“isValidated”,“var isUserAuthenticated=”+userAuthenticated);

    你现在看到问题了吗?你可以在Ajax中做同样的事情…但它也有同样的问题。

    好吧,我认为这样做对用户来说是一种简单的方便…例如,如果某些链接获得授权,则显示这些链接。但它在任何形式或形状上都不安全。只需帮自己一个忙,然后在代码隐藏中处理这个问题。