J'ai un standard AccountController classe de projet ASP.NET MVC5. Lorsque j'essaie de me déconnecter, je suis confronté à un erreur coz HttpContext
est null
. (Je veux dire ici HttpContext
. GetOwinContext (). Authentification est nul)
Je ne peux donc pas savoir comment déconnecter l'utilisateur à la fin de la session ...
Dans global.asax j'ai ceci
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 a
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")
});
}
Pour cela, vous devez définir un attribut ActionFilter et là, vous devez rediriger l'utilisateur vers l'action de contrôleur respective. Là, vous devez vérifier la valeur de la session et si elle est nulle, vous devez rediriger l'utilisateur. Voici le code ci-dessous ( vous pouvez également visiter mon blog pour l'étape de détail ):
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"
}));
}
}
}
}
}
En supposant que vous utilisez ApplicationCookie pour stocker vos informations de connexion.
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
Un appel à Session_End () provoque l'exception. Cela est totalement attendu car vous ne pouvez pas simplement créer new AccountController()
, appeler accountController.SignOut()
et vous attendre à ce que cela fonctionne. Ce nouveau contrôleur n'est pas connecté au pipeline MVC - il n'a pas HttpContext et toutes ses autres exigences pour pouvoir fonctionner.
Vous devez déconnecter les utilisateurs en réponse à une demande qu'ils ont faite. Créez un nouveau projet MVC avec l'authentification des comptes individuels. Ouvrez AccountController et jetez un œil à la méthode LogOff()
:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
AuthenticationManager.SignOut();
return RedirectToAction("Index", "Home");
}
Ici, AuthenticationManager.SignOut()
sera exécutée en réponse à une demande POST dans/Account/LogOff. À chaque fois qu'une telle demande arrive, ASP.NET/MVC créera une instance de AccountController et initialisera Après cela, la méthode LogOff sera appelée où vous pourrez réellement exécuter AuthenticationManager.SignOut();
.
Toujours dans l'application ASP.NET/MVC par défaut avec identité déclare AuthenticationManager dans la région Helpers du code comme suit:
private IAuthenticationManager AuthenticationManager { get { return HttpContext.GetOwinContext().Authentication; } }
J'espère que cela t'aides.
J'ai essayé tout ça:
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);
mais finalement cela a résolu mon problème:
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());
`` ''
Cela a fonctionné pour moi
`public void SignOut()
{
IOwinContext context = _context.Request.GetOwinContext();
IAuthenticationManager authenticationManager = context.Authentication;
authenticationManager.SignOut(AuthenticationType);
}
`
Le seul problème que j'ai est qu'il n'y a pas de redirection vers la connexion, donc je reçois une erreur de vue introuvable car la vue à laquelle je me suis déconnecté est sous un attribut [Autoriser]. Je pensais que la redirection automatique était intégrée lorsqu'un utilisateur n'est pas autorisé par ce bloc de code ...
`app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "ApplicationCookie",
LoginPath = new PathString("/Account/Login"),
ExpireTimeSpan = TimeSpan.FromHours(1),
});
`