我有一个主要的 asp.net 应用程序,它是用 asp.net 1.1 编写的。在应用程序下方运行的是几个 2.0 应用程序。要完全注销用户,我可以使用 FormsAuthentication.SignOut 注销 1.1 应用程序还是比这更复杂?
4 回答
您要执行的操作称为单点登录和单点注销。根据您设置应用程序的方式存在差异。我将尝试澄清这些差异在哪里发挥作用。
要实现单点登录和单点注销,您需要使所有应用程序之间的 cookie 名称、保护和路径属性相同。
<authentication mode="Forms">
<forms name=".cookiename"
loginUrl="~/Login.aspx"
timeout="30"
path="/" />
</authentication>
接下来,您需要添加机器密钥,并且它们在所有应用程序之间必须相同。
<machineKey validationKey="F9D1A2D3E1D3E2F7B3D9F90FF3965ABDAC304902"
encryptionKey="F9D1A2D3E1D3E2F7B3D9F90FF3965ABDAC304902F8D923AC"
validation="SHA1" />
您在为应用程序使用二级或三级域吗?如果是这样,您将需要通过将域添加到 cookie 来做更多的事情:
protected void Login(string userName, string password)
{
System.Web.HttpCookie cookie = FormsAuthentication.GetAuthCookie(userName, False);
cookie.Domain = "domain1.com";
cookie.Expires = DateTime.Now.AddDays(30);
Response.AppendCookie(cookie);
}
现在要进行单点注销,调用 FormsAuthentication.SignOut 可能还不够。下一个最好的方法是将 cookie 过期设置为过去的日期。这将确保 cookie 不会再次用于身份验证。
protected void Logout(string userName)
{
System.Web.HttpCookie cookie = FormsAuthentication.GetAuthCookie(userName, False);
cookie.Domain = "domain1.com";
cookie.Expires = DateTime.Now.AddDays(-1);
Response.AppendCookie(cookie);
}
我考虑到您对所有应用程序都使用相同的数据库。如果应用程序使用单独的数据库进行注册和身份验证,那么我们将需要做更多的事情。如果是这种情况,请告诉我。否则这应该适合你。
如果您为所有应用程序都拥有一个中央会话存储,这可能会更容易。然后,您可以在一处将会话设置为空。
这对我有用:
在 Logout 事件中,使用 Request 对象中的 Cookies 集合代替 FormsAuthentication.GetAuthCookie 方法,如下所示:
HttpCookie cookie = Request.Cookies.Get(otherSiteCookieName);
cookie.Expires = DateTime.Now.AddDays(-1);
HttpContext.Current.Response.Cookies.Add(cookie);
当然,这需要您知道您希望用户退出的站点的 Cookie 名称 - 但是,如果您在所有 Web 应用程序中使用相同的 cookie,这将不是问题。
我更喜欢使用 web.config
<authentication mode="Forms">
<forms domain=".tv.loc" loginUrl="~/signin" timeout="2880" name="auth" />
</authentication>