2014-08-31 16 views
7

Spero che qualcuno possa aiutarmi con questo problema - mi sta facendo impazzire! :)MVC 5 OWIN - IsAuthenticated è false all'accesso esterno (QQ Connect)

Sto cercando di utilizzare login esterno attraverso QQ Connect (OAuth 2.0) utilizzando QQ di tinysnake Collegare fornitore: https://github.com/tinysnake/microsoft-owin-security-qq

Tutto sembra andare per il grande - posso accedere tramite il mio conto QQ e ottengo inviato al mio ExternalLoginCallBack-metodo con le attestazioni appropriate ecc. Io uso questi valori per firmare l'utente attraverso IAuthenticationManager - tutto va bene. Tuttavia, quando reindirizzo l'utente a un'altra pagina e controlla se ha effettuato l'accesso, quindi ottengo un valore falso dal valore IsAuthenticated ... e non riesco a leggere nessuna delle affermazioni che ho impostato in precedenza.

Potrebbe essere una semplice correzione - ma non riesco proprio a vederlo adesso :)

Alcuni codice:

AuthConfig:

public static void ConfigureAuthentication(IAppBuilder app) 
{ 
    app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

    // Normal cookie sign in 
    app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
     LoginPath = new PathString("/Account/Login"), 
     AuthenticationMode = AuthenticationMode.Active 
    }); 

    // QQ CONNECT 
    app.UseQQConnectAuthentication(
     appId: "XXXXXX", 
     appSecret: "XXXXXXXXXXXXXXXXX"); 
} 

AccountController:

// 
// POST: /Account/ExternalLogin 
[System.Web.Mvc.HttpPost] 
[System.Web.Mvc.AllowAnonymous] 
[ValidateAntiForgeryToken] 
public ActionResult ExternalLogin(string provider, string returnUrl) 
{ 
    // Request a redirect to the external login provider 
    return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl })); 
} 

// 
// GET: /Account/ExternalLoginCallback 
[System.Web.Mvc.AllowAnonymous] 
[HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)] 
public async Task<ActionResult> ExternalLoginCallback(string returnUrl) 
{ 
    var ctx = Request.GetOwinContext(); 
    var result = ctx.Authentication.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie).Result; 
    var claims = result.Identity.Claims.ToList(); 
    var name = claims.First(i => i.Type == "urn:qqconnect:name"); 

    claims.Add(new Claim(ClaimTypes.AuthenticationMethod, "QQ")); 
    claims.Add(new Claim(ClaimTypes.Name, name.Value)); 

    var ci = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ExternalCookie); 
    ctx.Authentication.SignIn(ci); 

    // DO OTHER STUFF HERE 

    return Redirect("~/"); 
} 

Tutto sembra andare bene finora ...

HomeController:

public ActionResult Index() 
{ 
    var model = new HomeViewModel(); 

    var ctx = Request.GetOwinContext(); 
    if (ctx.Authentication.User.Identity.IsAuthenticated) // <-- THIS RETURNS FALSE 
    { 
     var claimsIdentity = User.Identity as ClaimsIdentity; 
     model.Name = claimsIdentity.FindFirst(ClaimTypes.Name).Value; 
     model.IsAuthenticated = true; 
    } 

    return View(model); 
} 

Quando controllo il ctx.Authentication.User.Identity.IsAuthenticated, ottengo un valore falso ... e Non riesco nemmeno a recuperare nessuna delle affermazioni.

mi sto perdendo qualcosa?

Qualsiasi aiuto sarebbe molto apprezzato :)

UPDATE

ho ottenuto il mio codice di lavoro facendo questo nel mio AccountController:

public async Task<ActionResult> ExternalLoginCallback(string returnUrl) 
{ 
    var ctx = Request.GetOwinContext(); 
    var result = ctx.Authentication.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie).Result; 

    if (result.Identity.IsAuthenticated) 
    { 
     // Signed in successfully 
     var claims = result.Identity.Claims.ToList(); 
     var name = claims.First(i => i.Type == "urn:qqconnect:name"); 

     //claims.Add(new Claim(ClaimTypes.AuthenticationMethod, "QQ")); 
     claims.Add(new Claim(ClaimTypes.Name, name.Value)); 

     var id = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie); 
     var authenticationManager = ctx.Authentication; 
      authenticationManager.SignIn(id); 

    } 

    return Redirect("~/"); 
} 

Ma il mio modo di vedere - qui' m utilizzando l'ApplicationCookie e NON il ExternalCookie per l'accesso ... o mi manca qualcosa del tutto? Questa soluzione funziona per me, ma mi piacerebbe sapere se questo è il modo giusto per farlo?

+1

Avere problemi simili con questo, se qualcuno può chiarire. – cchamberlain

risposta

1

Dalla mia comprensione, ci si aspetta che cosa stai vivendo. Estremamente Semplificando:

  1. L'applicazione ottiene l'informazione esterna e l'usa per creare un cookie esterno
  2. il cookie esterno viene inviato al tuo app con il presupposto che si tratta solo di un cookie temporaneo che verrà utilizzato per cercare tutte le informazioni locali aggiuntive sull'utente e quindi convertite in un cookie locale [applicazione]

Vedere UseCookieAuthentication vs. UseExternalSignInCookie per un guasto un po 'più approfondito.

Problemi correlati