Как выйти из системы в 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),
    });
`
