我有一个使用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 帮助我理解为什么无法从客户端脚本访问身份验证票证。
答案 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中做同样的事情......但它也有同样的问题。
好的,我可以看到这样做对用户来说是一个简单的方便...如果他们被授权,则显示某些链接。但它在任何形式或形式上都不安全。只需帮自己一个忙,然后在代码隐藏中处理它。