2015-03-17 12 views
9

Mein Projekt basiert auf der MVC 5-Projektvorlage von Visual Studio 2013 (individuelle Benutzerkontooption). Ich habe mich auf die Standardmethode für das Anmelden und Abmelden für meine Benutzer verlassen. Aber ich bin mir nicht sicher, was ich getan habe, irgendwann können sich Benutzer nicht mehr abmelden, sie können sich jedoch als ein anderer Benutzer anmelden.MVC AuthenticationManager.SignOut() signiert nicht

Dies ist die Standardabmeldeverfahren Konto-Controller

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult LogOff() 
    { 
     AuthenticationManager.SignOut(); 
     return RedirectToAction("Index", "Home"); 
    } 
    private IAuthenticationManager AuthenticationManager 
    { 
     get 
     { 
      return HttpContext.GetOwinContext().Authentication; 
     } 
    } 

Dies ist der Standard _LoginPartial.cshtml Ansicht, die Benutzernamen des Benutzers zeigt.

@using Microsoft.AspNet.Identity 
    @if (Request.IsAuthenticated) 
    { 
     using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" })) 
     { 
      @Html.AntiForgeryToken() 

      <ul class="nav navbar-nav navbar-right"> 
       <li> 
        @Html.ActionLink("Hello " + User.Identity.GetUserName() + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" }) 
       </li> 
       <li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a>   </li> 
      </ul> 
     } 
    } 
    else 
    { 
     <ul class="nav navbar-nav navbar-right"> 
      <li>@Html.ActionLink("Register", "Register", "Account", routeValues: null, htmlAttributes: new { id = "registerLink" })</li> 
      <li>@Html.ActionLink("Log in", "Login", "Account", routeValues: null, htmlAttributes: new { id = "loginLink" })</li> 
     </ul> 
    } 

Wenn der Benutzer abmeldet, es Benutzer auf die Login-Seite leitet, aber Benutzernamen des Benutzers wird noch gezeigt, was bedeutet, dass sie aus nicht unterzeichnet haben. Und die URL im Browser zeigt http://localhost/Account/Login?ReturnUrl=%2FAccount%2FLogOff

Es bringt den Benutzer nicht zurück zur Indexseite von Home. Also meine Vermutung ist, dass etwas bei der Anweisung AuthenticationManager.SignOut(); passiert ist. Ich bin verwirrt, weil ich nichts an den Account Controller geändert habe.

Jede Leitung würde sehr geschätzt werden.

Antwort

7

Ich hatte das gleiche Problem. Sehen Sie sich diese Ausgabe auf CodePlex:

https://aspnetidentity.codeplex.com/workitem/2347

Ich hoffe, dass ich Ihnen helfen.:-)

+2

Mein Problem ist bei 'SignOut()' nicht aufgetreten. Das liegt daran, dass ich '[authorize (Role =" admin ")]' über dem Controller hinzugefügt habe, was ich nicht bemerkt habe. Aber ich bin sicher, dass es vielen Leuten helfen wird, deren Problem tatsächlich bei "SignOut()" mit der Owin-Authentifizierung aufgetreten ist. – Ramesisiii

+0

@ Ramesisiii "Das liegt daran, dass ich [authorize (Role =" admin ")] hinzugefügt habe" Danke, dass du das erwähnt hast. Ich habe viele Stunden damit verbracht, nicht zu wissen, was dazu führte, dass meine Methode logout() von einem Konto, das kein Administrator ist, nicht aufgerufen werden konnte. +1 für dich. – CB4

1

Fügen Sie einfach diese Codezeile nach SignOut():

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

Auch diese Besuche: Page.User.Identity.IsAuthenticated still true after FormsAuthentication.SignOut()

+0

Es stellt sich heraus, mein Problem nicht aus AuthenticationManager.SignOut() gekommen, aber Ich habe noch die obige Aussage in meinem Projekt getestet und es hat nicht funktioniert (Benutzer ist immer noch angemeldet). Ich denke, dass diese Lösung speziell für die ** Formularauthentifizierung ** geeignet ist und mein Projekt die ** OWIN-Authentifizierung ** verwendet. – Ramesisiii

+0

Oh, es schlägt nie. Ich hatte ein Problem (_LoginPartial View zeigte den Benutzernamen an). Dann versuchte ich mich von derselben Seite in derselben Anfrage abzumelden. Aus diesem Grund müssen Sie den Benutzer HttpContext löschen. Dies ist nützlich, wenn Sie den aktuellen Benutzer abmelden und mit der aktuellen Seite antworten möchten, ohne eine Umleitung vorzunehmen. – Ice2burn

2

Ich dachte, mein Problem nicht bei SignOut() war. Wenn Sie der Meinung sind, dass Ihr Problem bei SignOut() liegt (und die OWIN-Authentifizierung verwendet), lesen Sie Sergio's link.

Für meinen Fall ist ein dummer Fehler! Ich habe vergessen, dass ich [Authorize(Role = "admins")] zum Controller hinzugefügt habe, weil ich nur die Admins wollte, die Registermethode zu verwenden, die mit der Standardvorlage geliefert wird. Und das Ergebnis ist, dass niemand außer den Admins abmelden kann! Diese

ist, was ich hatte:

[Authorize(Roles = "admin")] 
public class AccountController : Controller 
{ 
    public ActionResult LogOff() 
    { 
    } 
    public ActionResult Register() 
    { 
    } 
} 

Was ich getan habe ist, ich die Register Methoden nur auf einen neuen Controller bewegen, wie unten:

[Authorize] 
public class AccountController : Controller 
{ 
    public ActionResult LogOff() 
    { 
    } 
} 

und

[Authorize(Roles = "admin")] 
public class AdminController : Controller 
{ 
    public ActionResult Register() 
    { 
    } 
} 

Jetzt kann sich jeder abmelden und nur Administratoren können Benutzer registrieren. (Und der Standard AuthenticationManager.SignOut() funktioniert gut.)

1

ersetzen

AuthenticationManager.Signout(); 

mit

AuthenticationManager.Signout(DefaultAuthenticationTypes.ApplicationCookie); 

nach der Ausgabe in Sergio Antwort

+0

hey, wenn Sergio darauf hinwies, solltest du das jetzt in seine Antwort einfügen, da der Codeplex-Link nicht mehr funktioniert. – TechSavvySam

Verwandte Themen