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?
Avere problemi simili con questo, se qualcuno può chiarire. – cchamberlain