複数の asp.net アプリケーションからログアウトするにはどうすればよいですか?
-
09-06-2019 - |
質問
私は、asp.net 1.1 で書かれたメインの asp.net アプリを持っています。アプリケーションの下でいくつかの 2.0 アプリが実行されています。ユーザーを完全にログアウトするには、FormsAuthentication.SignOut を使用して 1.1 アプリからログアウトするだけで済みますか、それともそれよりも複雑ですか?
解決
あなたがやろうとしていることは、シングルサインオンとシングルサインオフと呼ばれます。アプリケーションの設定方法によって違いがあります。これらの違いがどこに影響するのかを明らかにしていきたいと思います。
シングル サインオンとシングル サインオフを実装するには、Cookie 名、保護、およびパス属性をすべてのアプリケーション間で同じにする必要があります。
<authentication mode="Forms">
<forms name=".cookiename"
loginUrl="~/Login.aspx"
timeout="30"
path="/" />
</authentication>
次に、マシン キーを追加する必要があります。マシン キーはすべてのアプリケーション間で同じである必要があります。
<machineKey validationKey="F9D1A2D3E1D3E2F7B3D9F90FF3965ABDAC304902"
encryptionKey="F9D1A2D3E1D3E2F7B3D9F90FF3965ABDAC304902F8D923AC"
validation="SHA1" />
アプリケーションに第 2 レベルまたは第 3 レベルのドメインを使用していますか?その場合は、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);
}
すべてのアプリケーションで同じデータベースを使用していることを考慮しています。アプリケーションが登録と認証に別のデータベースを使用する場合は、さらにいくつかの作業が必要になります。このような場合はお知らせください。それ以外の場合は、これでうまくいくはずです。
他のヒント
すべてのアプリケーションに対して中央のセッション ストアを持っている場合は、より簡単になる可能性があります。その後、1 か所でセッションを null に設定できます。
これは私にとってはうまくいきました:
Logout イベントでは、FormsAuthentication.GetAuthCookie メソッドの代わりに、次のように Request オブジェクトの Cookie コレクションを使用します。
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>