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