2014-10-03 14 views
9

Ich habe eine Standard AccountController Klasse von ASP.NET MVC5-Projekt. Wenn ich versuche, mich abzumelden, sehe ich einen Fehler coz HttpContext ist null. (Ich meine hier HttpContext.GetOwinContext(). Authentication null ist)Abmelden Benutzer in OWIN ASP.NET MVC5

So kann ich nicht bekommen, wie wir Benutzer abmelden kann, wenn Sitzung endet ...

In global.asax Ich habe haben diese

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) 
      { 
      } 
} 

Account

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 hat

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

Antwort

2

Dazu müssen Sie ein ActionFilter-Attribut definieren und dort müssen Sie den Benutzer auf die jeweilige Controller-Aktion umleiten. Dort müssen Sie nach dem Sitzungswert suchen und wenn der Wert null ist, müssen Sie den Benutzer umleiten. Hier ist der Code (Also you can visit my blog for detail step):

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

       } 
      } 

     } 

    } 
} 
8

Ein Aufruf zu Session_End() die Ausnahme verursacht. Das ist völlig zu erwarten, da Sie nicht einfach new AccountController() erstellen, accountController.SignOut() anrufen können und erwarten, dass es funktioniert. Dieser neue Controller ist nicht mit der MVC-Pipeline verdrahtet - er hat nicht HttpContext und alle anderen Voraussetzungen, um arbeiten zu können.

Sie sollten Benutzer als Reaktion auf eine Anfrage protokollieren, die sie vorgenommen haben. Erstellen Sie ein neues MVC-Projekt mit Authentifizierung für einzelne Konten. Öffnen Account und werfen Sie einen Blick auf die LogOff() Methode:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult LogOff() 
    { 
     AuthenticationManager.SignOut(); 
     return RedirectToAction("Index", "Home"); 
    } 

Hier AuthenticationManager.SignOut() wird als Antwort auf eine POST-Anfrage an/Konto/Abmelde ausgeführt werden. Immer wenn eine solche Anfrage eintrifft, erstellt ASP.NET/MVC eine Instanz von AccountController und initialisiert sie ordnungsgemäß. Danach wird die LogOff-Methode aufgerufen, in der Sie AuthenticationManager.SignOut(); ausführen können.

Auch in dem Standard ASP.NET/MVC Anwendung mit Identität erklärt AuthenticationManager in den Helfern Region des Codes wie folgt:

private IAuthenticationManager AuthenticationManager { get { return HttpContext.GetOwinContext().Authentication; } } 

Hoffnung, das hilft.

+0

Ja, ich stimme zu. Wir haben diese Methode standardmäßig, aber ich möchte einen Benutzer abmelden und ihn zur Anmeldeseite umleiten. Also brauche ich eine Lösung, um es mit OWIN zu machen. Wie auch immer, danke für deine Meinung! –

+0

@ClarkKent Diese Lösung tut es mit OWIN, ich habe die Antwort bearbeitet, um zu erklären, wie es das macht. Bitte beachten Sie die anstehenden Änderungen. Milan erklärt, warum es einen Fehler gibt, bevor Sie Ihre Benutzer abmelden. – Termato

+0

Nun ... Ijust kommentierte Code innerhalb 'Session_End' und ich habe seltsames Verhalten der Anwendung. Ich setze SessionTimeout 1 min. Wenn ich mich anmelde und nichts mache, funktioniert es gut. Also 1 Minute später, wenn ich die Seiten aktualisiere, loggt es sich aus und leitet zur LOGIN Seite um. Aber wenn während 2-3 Minuten. Ich navigiere innerhalb der Website, es funktioniert nicht. :) –

12

Unter der Annahme, dass Sie ApplicationCookie verwenden, um Ihre Login-Daten zu speichern.

AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie); 
+0

Es besagt, der AuthManager hat keine Methode 'SignOut' – Phil

+1

Sie können versuchen mit var ctx = Request.GetOwinContext(); var authenticationManager = ctx.Authentication; authenticationManager.SignOut (DefaultAuthenticationTypes.ApplicationCookie); – radbyx

2

Ich habe versucht, das alles aus:

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

aber schließlich das mein Problem gelöst:

HttpContext.User = new GenericPrincipal(new GenericIdentity(string.Empty),null); 

Check

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

`` `

1

Dieser arbeitete für mich

`public void SignOut() 
    { 
     IOwinContext context = _context.Request.GetOwinContext(); 
     IAuthenticationManager authenticationManager = context.Authentication; 
     authenticationManager.SignOut(AuthenticationType); 
    } 
` 

Das einzige Problem, das ich habe, ist keine Umleitung gibt es so Login ich eine Ansicht nicht gefunden Fehler, weil die Ansicht, die ich unter einem ist abgemeldet [autorisieren] Attribut. Ich dachte, die automatische Weiterleitung wurde eingebaut, wenn ein Benutzer nicht von diesem Codeblock autorisiert ist ...

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