ブラウザが閉じられたとき、またはユーザーが新しいアドレスを入力したときに、ASP.NET が認証から強制的にサインアウトする方法はありますか?
ブラウザを開いたままにしておくと、ユーザーの認証を維持する必要があるため、認証チケットのタイムアウトを長くすることが望ましいです。
ブラウザが閉じられたとき、またはユーザーが新しいアドレスを入力したときに、ASP.NET が認証から強制的にサインアウトする方法はありますか?
ブラウザを開いたままにしておくと、ユーザーの認証を維持する必要があるため、認証チケットのタイムアウトを長くすることが望ましいです。
これがまだ問題であるかどうかはわかりませんが、これで問題は解決しました。スタート ページの Page_Load イベントに次を追加するだけです。
protected void Page_Load(object sender, EventArgs e)
{
if (Request.UrlReferrer == null || string.IsNullOrEmpty(Request.UrlReferrer.AbsolutePath))
{
Session.Abandon();
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
}
}
私はしばらくこれに取り組んでおり、さまざまな投稿や回答、推測、憶測を読んだり見たりしています。
このソリューションには重大な注意点があります。JavaScript と同様に、ポップアップ ウィンドウ (「BURN HIM !!!」と叫びます) が必要です。ただし、これを非常に安全に実装する必要があることを考えると、セキュリティを維持するためにユーザーがこれを受け入れ、JavaScript を有効にするようにコーディングできると推測できます。
ステップ 1 - ポップアップが有効になっていることを確認します - 有効になっていない場合は、有効にする方法の手順にリダイレクトします
Global.asax で
セッション変数をセットアップして、ポップアップがチェックされているかどうかを確認します。
void Session_Start(object sender, EventArgs e)
{
// Code that runs when a new session is started
Session["popupsChecked"] = false;
}
Page.aspx / masterPage.master で
セッション変数を確認します。false の場合 (このセッションで初めてサイトにアクセスした場合)、JavaScript を挿入してポップアップの可用性を確認します。
if (!IsPostBack)
{
if (!(bool)Session["popupsChecked"])
{
Page.Header.Controls.Add(new LiteralControl("<script src=\"/js/popupCheck.js\" type=\"text/javascript\"></script>"));
}
}
popupCheck.js ファイル(ファイル「enablePopups.aspx」は、問題のサイトでポップアップを有効にする方法に関する指示です)
$(function () {
result = window.open("/static/popupCheck.aspx", "popped", "width=10, height=10, location=no, menubar=no, status=no, toolbar=no, scrollbars=no, resizable=no");
if (result != null) {
// Not blocking
if (window.location.pathname != "/static/enablePopups.aspx") {
window.location = "/";
};
}
else {
//blocking
if (window.location.pathname != "/static/enablePopups.aspx") {
window.location = "/static/enablePopups.aspx";
};
}
});
最後に、popupCheck.aspx
<head runat="server">
<title>Popup Checker</title>
<script language="javascript" type="text/javascript">
window.close();
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
Popup windows are enabled, please close this window.
</div>
</form>
</body>
</html>
コードビハインドで以下を使用すると、ポップアップウィンドウが有効になっているかどうかを確認するための以降のチェックが停止します。
protected void Page_Load(object sender, EventArgs e)
{
Session["popupsChecked"] = true;
}
したがって、この時点で、ユーザーにこのサイトのポップアップを有効にするよう「強制」しました - 前述のように、サイトのコンテンツはこの煩わしさを正当化するはずです。
ステップ 2 - 彼らがどこに向かっているのかを確認し、オフになっている場合は、ログオフをポップアップ表示します
メインのJavaScriptブロック、ファイル、データ、または現在行っている方法で
var siteLinkClicked = false;
var isAuthenticated = false;
$(function() {
// Check if user is authenticated
if ($("#someElementThatOnlyAppearsWhenLoggedIn").length) { isAuthenticated = true; };
// Check if any of the links clicked are in the site
$("a, input").click(function () { // -- You may need more then "a" and "input" tags, or exceptions
siteLinkClicked = true;
});
$(window).bind("beforeunload", function (event) {
if (siteLinkClicked == false && isAuthenticated == true) {
// popup the logout page
window.open("/popupLogout.aspx", "popupLogout", "status=0,location=0,directories=0,menubar=0,scrollbar=0,resizable=0,width=400,height=200")
};
});
});
そしてpopupLogout.aspx
親 (オープナー) の場所を確認する JavaScript があります。このポップアップと同じ場合 (つまり、ユーザーが更新をクリックした場合、または の要素を見逃した場合siteLinkClicked
)、何もせずにウィンドウを閉じます。
$(function () {
setTimeout(checkParent, 5000); // Give some time for the new window to load if they've navigated away - A counter could be added, logging off in 5... 4... 3... You get the idea.
window.blur(); // And stick this to the back
});
function checkParent() {
var openerLocation = null;
try {
openerLocation = window.opener.location.hostname
} catch (e) {
openerLocation = null;
}
if (openerLocation == window.location.hostname) {
window.close();
} else {
$("#<%= cmdLogout.ClientID %>").click();
// setTimeout(window.close(), 1000); // Removed and add a redirect to static "loggedOut.html page
};
};
場所が異なる/未定義の場合は、ボタンをクリックしてウィンドウを閉じます。
<asp:Button Text="logout..." runat="server" ID="cmdLogout" OnClick="cmdLogout_click" />
そして、ボタンは次のコードをトリガーします。
protected void cmdLogout_click(object sender, EventArgs e)
{
System.Web.Security.FormsAuthentication.SignOut();
Session.Abandon();
Response.Redirect("~/static/loggedOut.htm"); // Added, can self close if needed in the HTML
}
最終的な制限の繰り返し
JavaScript やポップアップがなければ、この方法は機能しません。少なくとも私にとっては、セキュリティが最優先される制御された環境で作業するので、このソリューションはエンド ユーザーの迷惑に値します。
これらの極限まで行かなければならない場合、データとアプリケーションは機密性が高いため、ユーザーは JavaScript を有効にし、ポップアップを有効にする必要があるとしか思えません。
有効期限を長く設定し、持続しないように設定して、探していると思われる正確な動作を得ることができるようです。例えば:
FormsAuthentication.SetAuthCookie("username", true);
これにより、ブラウザを閉じたときに Cookie が保持されるように設定され、ブラウザを閉じてサイトを再度ロードしても、有効期限が切れるまでログインする必要がなくなります。時間は発生していません。
一方で:
FormsAuthentication.SetAuthCookie("username", false);
これにより、Cookie が保持されないように設定されます。ブラウザを閉じると、Cookie は削除されるため、有効期限が切れたかどうかに関係なく、次回の読み込み時にログインが強制されます。詳細については、こちらを参照してください。FormsAuthentication.SetAuthCookie