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

时间:2010-02-24 20:20:42

标签: asp.net javascript forms-authentication

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

    <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 帮助我理解为什么无法从客户端脚本访问身份验证票证。

3 个答案:

答案 0 :(得分:5)

它是空白的原因是因为cookie被标记为HttpOnly而受到保护。这意味着无法通过脚本访问它。关闭它是一个非常糟糕的主意,因为您网站中的XSS漏洞可能会将其暴露给cookie被盗,所以我不会告诉您如何做到这一点。

答案 1 :(得分:1)

正如其他人所说,认证票是,并且应该是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>

答案 2 :(得分:0)

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

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

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

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

好的,我可以看到这样做对用户来说是一个简单的方便...如果他们被授权,则显示某些链接。但它在任何形式或形式上都不安全。只需帮自己一个忙,然后在代码隐藏中处理它。