Как выйти из системы в OWIN ASP.NET MVC5

у меня есть стандартный AccountController класс ASP.NET проект MVC5. Когда я пытаюсь выйти из пользователя, я сталкиваюсь с ошибкой coz HttpContext is null. (Я имею в виду HttpContext.GetOwinContext ().Проверка подлинности равно null)

поэтому я не могу понять, как мы можем выйти из системы, когда сеанс заканчивается...

на глобальные.асакс у меня есть это

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

Автозагрузка.Автор.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")
            });
}

6 ответов


для этого вам нужно определить атрибут 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() будет выполняться в ответ на запрос POST в /Account / LogOff. Когда такой запрос приходит ASP.NET/MVC создает экземпляр AccountController и инициализировать его правильно. После этого будет вызван метод LogOff, где вы можете фактически выполнить AuthenticationManager.SignOut();.

также по умолчанию ASP.NET/MVC приложение с идентификатором объявляет 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]. Я думал, что автоматическое перенаправление было встроено, когда пользователь не авторизован этим блоком кода...

`app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = "ApplicationCookie",
        LoginPath = new PathString("/Account/Login"),
        ExpireTimeSpan = TimeSpan.FromHours(1),
    });
`