2014-06-11 8 views
5

Ich mache eine neue (leere Vorlage) ASP.NET MVC 5-Anwendung, und ich kann nicht von dieser App abmelden. Meine Abmelde Aktion:Kann nicht aus der Identität MVC 5 Anwendung

public ActionResult LogOff() 
{ 
    if (User.Identity.IsAuthenticated) 
    { 
     //break here 
    } 
    try 
    { 
     AuthenticationManager.SignOut(); 
     if (User.Identity.IsAuthenticated || Request.IsAuthenticated) 
     { 
      //break here; 
     } 
    } 
    return RedirectToAction("Login", "Account"); 
} 

Startklasse:

public partial class Startup 
{ 
    public void ConfigureAuth(IAppBuilder app) 
    { 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Account/Login") 
     }); 
     app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 
    } 
} 

Anwendungskontext:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public ApplicationDbContext() 
     : base("DefaultConnection", false) 
    { 
    } 
} 

Verbindungszeichenfolge:

<connectionStrings> 
<add name="DefaultConnection" connectionString="Server=.;Database=DataTest;Trusted_Connection=True;" providerName="System.Data.SqlClient" /> 
</connectionStrings> 

Die Aktion LogOff() führt ohne Probleme und leitet mich auf die 'Login' Aktion, aber ich bin immer noch angemeldet. Was ist los mit ihm?

Antwort

1

Die meisten Ihrer Code scheint mir gut. Ich würde vermuten, dass etwas in deiner Handlungsweise nicht stimmt. Normalerweise ist das einzige, was hier zu tun ist,

public ActionResult LogOff() 
{ 
    AuthenticationManager.SignOut(); 

    return RedirectToAction("Login", "Account"); 
} 

Ich weiß nicht, ob die if-Blöcke zu Ihrem Zeichen Out-Prozess von entscheidender Bedeutung sind, aber diese zwei Liner ist das einzige, was Sie zu tun haben. Wenn es entscheidend ist, sollten Sie über den Debugger überprüfen, ob die SignOut Methode getroffen wird.

+0

Ja, ich weiß, ich habe nur den anderen Code, um zu überprüfen, ob der Benutzer noch authentifiziert. Das Problem ist, dass die App scheint, die Daten von einem Cookie oder etwas zu bekommen, und dann loggte ich mich nach dem Ausführen dieser Aktion noch ein. – gog

+1

Denken Sie auch daran, dass Sie bei Verwendung von Chrome möglicherweise nicht abgemeldet werden: http://StackOverflow.com/questions/23632725/how-do-i-log-a-user-out-when-they -close-ihr-browser-oder-tab-in-asp-net-mvc/23633068 # 23633068 –

+0

Der Cookie sollte gelöscht werden, nachdem diese Methode ausgeführt wird (mit dem Setup in Ihrer Startup-Klasse gewählt). Erkundigen Sie sich bei den Entwicklertools Ihres Browsers, ob der Cookie noch vorhanden ist. Bezüglich Chrome verwende ich es sehr für die Entwicklung und hatte noch kein Problem mit Identity. –

4

Try this:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult LogOff() 
    { 
     //AuthenticationManager.SignOut(); 
     AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie, DefaultAuthenticationTypes.ExternalCookie); 
     Session.Abandon(); 
     return RedirectToAction("Login", "Account"); 
    } 
+0

Warum ist das ein Post? – Halter

+0

Entschuldigung, warum benutzt man '[HttpPost]'. sollte präziser sein – Halter

+0

@Halter - Aktionen, die muate Zustand sollte nicht Get Aktionen sein. Dies macht es unglaublich einfach für jemanden, sich als Streich abzumelden, weil jemand zum Beispiel ein '' Tag hinzugefügt hat, das auf/Abmelden zeigt. –

0

Das ist für mich gearbeitet: eine Route in Ihrem RouteConfig.cs erstellen wie

routes.MapRoute(
     "userlogout", 
     "Account/Logout", 
     new { controller = "Account", action = "LogOff" } 
     ); 

Und Sie können den Standard-Abmelde Code in AccountController.cs halten oder addieren Sie die Zusätze (wie session.abandon(); usw.) andere haben vorgeschlagen Aber gerade wie unten sollte

arbeiten
0

Das scheint für mich gut zu funktionieren.

public ActionResult Logoff() 
{ 
    HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1)); 
    HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    HttpContext.Response.Cache.SetNoStore(); 

    Session.Clear(); 
    Session.Abandon(); 
    Session.RemoveAll(); 
    FormsAuthentication.SignOut(); 
    return RedirectToAction("Index", "Home"); 
} 
2
app.UseCookieAuthentication(new CookieAuthenticationOptions 
      { 
       AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
       LoginPath = new PathString("/Account/Login"), 
       LogoutPath = new PathString("/Account/SignOut"), 
       Provider = new CookieAuthenticationProvider 
       { 
        // Enables the application to validate the security stamp when the user logs in. 
        // This is a security feature which is used when you change a password or add an external login to your account. 
        OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
         validateInterval: TimeSpan.FromMinutes(30), 
         regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
       } 
      });  

^^ Stellen Sie die "LogoutPath" in Startup.Auth.cs auf welchem ​​Wege Sie

0

In diesem Fall wünschen Sie auch folgendes tun könnte: entfernen Sie die [ HttpPost] von Ihrer LogOff-Aktion und setzen Sie stattdessen [HttpGet]. Sie müssen nur die AntiForgeryToken übergeben. Aber die Frage wird sein, ob dies ein sehr sicherer Weg ist. Weitere Informationen finden Sie hier: Using MVC3's AntiForgeryToken in HTTP GET to avoid Javascript CSRF vulnerability

[HttpGet] 
[ValidateAntiForgeryToken] 
public ActionResult LogOff() 
{ 
    AuthenticationManager.SignOut(); 
    return RedirectToAction("Login", "Account"); 
} 
0

Über ASP.Net MVC Logout nicht funktioniert: -

ich ein Problem hatte, wo App auf IIS in Produktionsmodi gehostet funktionierte nicht richtig mit Chrom

obwohl es funktionierte wurde direkt während - Visual Studio Dev mit in allen Browsern Hosting - in Produktionsmodus über IE

Ich hatte Probleme in Startup.Auth.CS. Stellen Sie sicher, dass doppelte Konfigurationen für folgende Dinge nicht vorhanden sind