webentwicklung-frage-antwort-db.com.de

Wie kann ich mich von Owin Providern ausloggen?

Ich folge diesem Tutorial aber es sagt Ihnen nicht, wie Sie sich ausloggen. Ich habe versucht zu tun 

Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ExternalCookie);

Request.GetOwinContext().Authentication.SignOut()

          Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie);

Den Beispielcode erhalten Sie hier: https://github.com/AndersAbel/SocialLoginWithoutIdentity

Sie müssen nur noch eine Aktion hinzufügen

public ActionResult SignOut()
 {
       Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ExternalCookie);
       return RedirectToAction("Index", "Home");
 }

Diese Methode plus eine der drei Zeilen, die ich oben gepostet habe 

Mein Ergebnis ist jetzt, ich melde mich an, gehe zur sicheren Seite und kann es sehen, dann gehe ich zu meiner Abmeldung und dann nach der Abmeldung versuche ich zur sicheren Seite zurückzukehren und ich darf zu dieser sicheren Seite zurück.

Also hat es mich eigentlich nicht wirklich abgemeldet.

16
chobo2

Wie im Tutorial erwähnt, verwenden die verwendeten middleWare den Standardauthentifizierungstyp, überschreiben ihn jedoch nicht. 

Wenn Sie nur externalCookie als Parameter für Owin verwenden, löschen Sie das Cookie für Asp, nicht jedoch das für die Speicherung des Google-Anbieters verwendete

um dies zu tun, müssen Sie sich das Array aller aktuellen Cookies besorgen ... Es kann auf einfache Weise folgendermaßen durchgeführt werden:

Request.GetOwinContext()
       .Authentication
       .SignOut(HttpContext.GetOwinContext()
                           .Authentication.GetAuthenticationTypes()
                           .Select(o => o.AuthenticationType).ToArray());

Dies ist, wo es im Tutorial gesagt wird:

Der Aufruf an UseGoogleAuthentication sollte offensichtlich sein, warum dies erforderlich ist. 

Der erste toSetDefaultSignInAsAuthenticationType lautet jedoch nicht wie offensichtlich. Die Login-Middleware basiert normalerweise auf der externen Cookie-Middleware vor der Social-Login-Middleware registriert. externe Cookie-Middleware, setzt sie sich selbst als Standard-Anmeldetyp . So weiß die Social Login Middleware, dass sie die .__ verwenden sollte. externer Cookie. In diesem Setup gibt es kein externes Cookie. Daher müssen Sie Angeben, um die Haupt-Cookie-Middleware manuell als Standard-Anmeldetyp festzulegen. Die Cookie-Middleware gibt nur dann ein Cookie aus, wenn die AuthenticationType stimmt mit der in der Identität überein, die von .__ erstellt wurde. Social Login Middleware. Betrachten Sie die externe Authentifizierungs-Pipeline

16
GaelSa

Versuchen Sie, die Cache-Kontrollheader einzustellen.

public ActionResult SignOut() {
    var authenticationTypes = new string[] {
        DefaultAuthenticationTypes.ApplicationCookie,  
        DefaultAuthenticationTypes.ExternalCookie 
    };
    AuthenticationManager.SignOut(authenticationTypes);
    // HACK: Prevent user from being able to go back to a logged in page once logged out
    Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetNoStore();
    // now redirect
    return RedirectToAction("Index", "Home");    
}

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

Der Benutzer kann nicht auf die Zurück-Schaltfläche im Browser geklickt werden, es sei denn, Sie versuchen mit JavaScript, das deaktiviert werden kann. Der Benutzer kann eine Seite zurückgehen und anzeigen, was auf der vorherigen Seite angezeigt wurde. Wenn Sie jedoch versuchen, auf geschützte Links zu klicken oder die Seite zu aktualisieren, werden sie zur Anmeldung umgeleitet.

3
Nkosi

Verwenden Sie das Attribut [Authorize] für Klassen, für die eine Autorisierung erforderlich ist:

 [Authorize]
public class MeController : ApiController
{
    // GET api/<controller>
    public IEnumerable<object> Get()
    {
        var identity = User.Identity as ClaimsIdentity;
        return identity.Claims.Select(c => new
        {
            Type = c.Type,
            Value = c.Value
        });
    }
}

quelle: http://www.asp.net/aspnet/overview/owin-and-katana/owin-oauth-20-authorization-server

0