標準AccountControllerASP.NET MVC5プロジェクトのクラスを持っています。ユーザーをログアウトしようとすると、エラーcoz HttpContext
はnull
です。 (つまり、ここではHttpContext
。GetOwinContext()。Authenticationがnullです)
セッションが終了したときにユーザーをログアウトする方法を取得できません...
global.asaxにはこれがあります
protected void Session_Start(object sender, EventArgs e)
{
Session.Timeout = 3;
}
protected void Session_End(object sender, EventArgs e)
{
try
{
var accountController = new AccountController();
accountController.SignOut();
}
catch (Exception)
{
}
}
AccountController
public void SignOut()
{
// Even if I do It does not help coz HttpContext is NULL
_authnManager = HttpContext.GetOwinContext().Authentication;
AuthenticationManager.SignOut();
}
private IAuthenticationManager _authnManager; // Add this private variable
public IAuthenticationManager AuthenticationManager // Modified this from private to public and add the setter
{
get
{
if (_authnManager == null)
_authnManager = HttpContext.GetOwinContext().Authentication;
return _authnManager;
}
set { _authnManager = value; }
}
Startup.Auth.csは
public void ConfigureAuth(IAppBuilder app)
{
// Enable the application to use a cookie to store information for the signed in user
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
ExpireTimeSpan = TimeSpan.FromMinutes(3),
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login")
});
}
そのためには、ActionFilter属性を定義する必要があり、そこでユーザーをそれぞれのコントローラーアクションにリダイレクトする必要があります。そこでセッション値をチェックする必要があり、その値がnullの場合はユーザーをリダイレクトする必要があります。以下にコードを示します( また、詳細な手順については私のブログにアクセスできます ):
public class CheckSessionOutAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName.ToLower().Trim();
string actionName = filterContext.ActionDescriptor.ActionName.ToLower().Trim();
if (!actionName.StartsWith("login") && !actionName.StartsWith("sessionlogoff"))
{
var session = HttpContext.Current.Session["SelectedSiteName"];
HttpContext ctx = HttpContext.Current;
//Redirects user to login screen if session has timed out
if (session == null)
{
base.OnActionExecuting(filterContext);
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new
{
controller = "Account",
action = "SessionLogOff"
}));
}
}
}
}
}
ログイン情報を保存するためにApplicationCookieを使用していると仮定します。
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
Session_End()を呼び出すと、例外が発生します。単純にnew AccountController()
を作成してaccountController.SignOut()
を呼び出し、機能することを期待することはできないので、それは完全に予想されます。この新しいコントローラーはMVCパイプラインに接続されていません-動作するためのHttpContextとその他すべての要件はありません。
ユーザーからの要求に応じて、ユーザーをログアウトする必要があります。個人アカウント認証を使用して新しいMVCプロジェクトを作成します。 AccountControllerを開き、LogOff()
メソッドを確認します。
_ [HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
AuthenticationManager.SignOut();
return RedirectToAction("Index", "Home");
}
_
ここでAuthenticationManager.SignOut()
は、/ Account/LogOffでのPOST要求に応答して実行されます。そのような要求が到着するたびに、ASP.NET/MVCはAccountControllerのインスタンスを作成して初期化しますその後、実際にAuthenticationManager.SignOut();
を実行できるLogOffメソッドが呼び出されます。
また、IDを使用するデフォルトのASP.NET/MVCアプリケーションでは、コードのHelpers領域でAuthenticationManagerを次のように宣言します。
_private IAuthenticationManager AuthenticationManager { get { return HttpContext.GetOwinContext().Authentication; } }
_
お役に立てれば。
私はこれをすべて試しました:
System.Web.HttpContext.Current.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie);
FormsAuthentication.SignOut();
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
Request.GetOwinContext().Authentication.SignOut();
Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie);
しかし、最終的にこれは私の問題を解決しました:
HttpContext.User = new GenericPrincipal(new GenericIdentity(string.Empty),null);
Session.Abandon();
var owinContext = System.Web.HttpContext.Current.Request.GetOwinContext();
var authenticationTypes = owinContext.Authentication.GetAuthenticationTypes();
owinContext.Authentication.SignOut(authenticationTypes.Select(o => o.AuthenticationType).ToArray());
「」
これは私のために働いた
`public void SignOut()
{
IOwinContext context = _context.Request.GetOwinContext();
IAuthenticationManager authenticationManager = context.Authentication;
authenticationManager.SignOut(AuthenticationType);
}
`
私が抱えている唯一の問題は、ログインへのリダイレクトがないため、ログアウトしたビューが[Authorize]属性の下にあるため、view not foundエラーが発生することです。ユーザーがこのコードブロックによって承認されていない場合、自動リダイレクトが組み込まれていると思いました...
`app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "ApplicationCookie",
LoginPath = new PathString("/Account/Login"),
ExpireTimeSpan = TimeSpan.FromHours(1),
});
`