web-dev-qa-db-ja.com

OWIN ASP.NET MVC5でユーザーをログアウトする方法

標準AccountControllerASP.NET MVC5プロジェクトのクラスを持っています。ユーザーをログアウトしようとすると、エラーcoz HttpContextnullです。 (つまり、ここでは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")
            });
}
11
Developer

そのためには、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"
                    }));

                }
            }

        }

    }
}
2

ログイン情報を保存するためにApplicationCookieを使用していると仮定します。

AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
14
radbyx

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; } }
_

お役に立てれば。

9
Milan Nankov

私はこれをすべて試しました:

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);

チェック

3
nasir taha
Session.Abandon();
var owinContext = System.Web.HttpContext.Current.Request.GetOwinContext();
var authenticationTypes = owinContext.Authentication.GetAuthenticationTypes();
owinContext.Authentication.SignOut(authenticationTypes.Select(o => o.AuthenticationType).ToArray());

「」

2
Stephan Ahlf

これは私のために働いた

`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),
    });
`
1
Daniel Jackson