如何注销多个asp.net应用程序?

时间:2020-03-05 18:51:08  来源:igfitidea点击:

我有一个主要的asp.net应用程序,它是用asp.net 1.1编写的。该应用程序下方运行着几个2.0应用程序。要完全注销用户,我可以使用FormsAuthentication.SignOut退出1.1应用程序,还是比这更复杂?

解决方案

回答

如果我们拥有所有应用程序的中央会话存储,可能会更容易。然后,我们可以在一处将会话设置为null。

回答

我们要执行的操作称为"单点登录"和"单点退出"。根据我们对应用程序的设置方式而有所不同。我将尝试澄清这些差异在哪里发挥作用。

要实现单点登录和单点退出,我们需要使所有应用程序之间的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);
}

我考虑到我们正在对所有应用程序使用相同的数据库。如果应用程序使用单独的数据库进行注册和身份验证,那么我们将需要做更多的事情。请让我知道是否是这种情况。否则,这应该为我们工作。

回答

这为我工作:

在注销事件中,代替FormsAuthentication.GetAuthCookie方法,请使用Request对象中的Cookies集合,如下所示:

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>