asp.net mvc - tutorial - Obtenga ExtraData de MVC5 framework Proveedor de identidad OAuth/OWin con proveedor de autenticación externo
login mvc c# (7)
Estoy tratando de usar el nuevo framework MVC5 en la vista previa de VS 2013.
El marco de autenticación de membresía se ha revisado y reemplazado con OWin
.
En particular, active el proveedor de autenticación externo Google auth.
Fue muy simple de hacer.
Simplemente app.UseGoogleAuthentication();
comentario de esta línea: app.UseGoogleAuthentication();
en el archivo Startup.Auth.cs en el directorio App_Start del nuevo proyecto MVC predeterminado.
Por lo tanto, quiero acceder a los "datos adicionales" que provienen del proveedor de autenticación, como una url para ver el avatar del usuario en mi aplicación.
En la implementación anterior de OAuth en comparación con el proveedor de Membresía asp.net, había una manera de capturar esto usando este diccionario ExtraData que se encuentra aquí: Propiedad ProviderDetail.ExtraData .
No puedo encontrar mucha documentación sobre cómo OAuth y OWin trabajan juntos y cómo acceder a estos datos adicionales.
¿Alguien puede iluminarme?
Con la versión RTW de la identidad de asp.net, el siguiente código en ExternalLoginCallback
hace por mí.
var externalIdentity = await HttpContext.GetOwinContext().Authentication
.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
var displayName = externalIdentity.Name;
var email = externalIdentity.FindFirstValue(ClaimTypes.Email);
Desafortunadamente, esto no es muy simple, una forma de hacerlo es enganchar el evento GoogleProvider Authenticated y agregar un reclamo personalizado a la identidad de reclamos con el avatar:
public class MyGoogleProvider : GoogleAuthenticationProvider {
public override Task Authenticated(GoogleAuthenticatedContext context) {
context.Identity.AddClaim(new Claim("avatarClaim", "<fetch avatar url here>"));
return base.Authenticated(context);
}
}
app.UseGoogleAuthentication(new GoogleAuthenticationOptions() { Provider = new MyGoogleProvider() });
Luego, dentro de AccountController, cuando se extrae la identidad externa, puede tomar este reclamo de avatar y almacenarlo en su objeto de usuario para usarlo más adelante.
Lo siguiente me funciona para facebook:
StartupAuth.cs:
var facebookAuthenticationOptions = new FacebookAuthenticationOptions()
{
AppId = "x",
AppSecret = "y"
};
facebookAuthenticationOptions.Scope.Add("email");
app.UseFacebookAuthentication(facebookAuthenticationOptions);
Método ExternalLoginCallback:
var externalIdentity = HttpContext.GetOwinContext().Authentication.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
var emailClaim = externalIdentity.Result.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email);
var email = emailClaim.Value;
Y para Google:
StartupAuth.cs
app.UseGoogleAuthentication();
Método ExternalLoginCallback (igual que para Facebook):
var externalIdentity = HttpContext.GetOwinContext().Authentication.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
var emailClaim = externalIdentity.Result.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email);
var email = emailClaim.Value;
Si configuro un punto de interrupción aquí:
var email = emailClaim.Value;
Veo la dirección de correo electrónico para Facebook y Google en el depurador.
Actualización : vea esta publicación en su lugar para una solución adecuada y completa; Obtener el correo electrónico de los proveedores externos Google y Facebook durante el paso de asociación de cuentas en una aplicación MVC5 predeterminada
Los siguientes detalles de publicación sobre cómo puede obtener datos adicionales de los proveedores sociales http://blogs.msdn.com/b/webdev/archive/2013/10/16/get-more-information-from-social-providers-used-in-the-vs-2013-project-templates.aspx
Recientemente tuve que acceder también a la imagen del perfil de Google y así es como lo resuelvo ...
Si solo habilita el código app.UseGoogleAuthentication();
en el archivo Startup.Auth.cs no es suficiente porque, en este caso, Google no devuelve ninguna información sobre la imagen del perfil (o no encontré cómo obtenerla).
Lo que realmente necesita es usar integración con OAuth2 en lugar de Open ID habilitada de manera predeterminada. Y así es como lo hice ...
En primer lugar, debe registrar su aplicación en el lado de Google y obtener "Client ID" y "Client secret". Una vez hecho esto, puede ir más allá (lo necesitará más adelante). Información detallada de cómo hacer esto here .
Reemplazar app.UseGoogleAuthentication();
con
var googleOAuth2AuthenticationOptions = new GoogleOAuth2AuthenticationOptions
{
ClientId = "<<CLIENT ID FROM GOOGLE>>",
ClientSecret = "<<CLIENT SECRET FROM GOOGLE>>",
CallbackPath = new PathString("/Account/ExternalGoogleLoginCallback"),
Provider = new GoogleOAuth2AuthenticationProvider() {
OnAuthenticated = async context =>
{
context.Identity.AddClaim(new Claim("picture", context.User.GetValue("picture").ToString()));
context.Identity.AddClaim(new Claim("profile", context.User.GetValue("profile").ToString()));
}
}
};
googleOAuth2AuthenticationOptions.Scope.Add("email");
app.UseGoogleAuthentication(googleOAuth2AuthenticationOptions);
Después de eso, puede usar el código para obtener acceso a la URL de la imagen del perfil de la misma manera que para cualquier otra propiedad
var externalIdentity = HttpContext.GetOwinContext().Authentication.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
var pictureClaim = externalIdentity.Result.Claims.FirstOrDefault(c => c.Type.Equals("picture"));
var pictureUrl = pictureClaim.Value;
Utilizando la respuesta de Alex Wheat, se me ocurrió una solución para recuperar el perfil, el género y el correo electrónico de Google + utilizando la Autenticación de Google.
Startup.Auth.cs:
var googleOptions = new GoogleOAuth2AuthenticationOptions()
{
ClientId = "<<client id - google>>",
ClientSecret = "<<secret for your app>>",
Provider = new GoogleOAuth2AuthenticationProvider()
{
OnAuthenticated = context =>
{
var userDetail = context.User;
context.Identity.AddClaim(new Claim(ClaimTypes.Name,context.Identity.FindFirstValue(ClaimTypes.Name)));
context.Identity.AddClaim(new Claim(ClaimTypes.Email,context.Identity.FindFirstValue(ClaimTypes.Email)));
var gender = userDetail.Value<string>("gender");
context.Identity.AddClaim(new Claim(ClaimTypes.Gender, gender));
var picture = userDetail.Value<string>("picture");
context.Identity.AddClaim(new Claim("picture", picture));
return Task.FromResult(0);
},
},
};
googleOptions.Scope.Add("https://www.googleapis.com/auth/plus.login");
googleOptions.Scope.Add("https://www.googleapis.com/auth/userinfo.email");
app.UseGoogleAuthentication(googleOptions);
Para obtener acceso a datos de perfil extendidos, debe agregar dos ámbitos a la solicitud: plus.login y userinfo.email. Si solo agrega el alcance más .login, no podrá ver el correo electrónico del usuario. Si usa la plantilla predeterminada de ASP.NET MVC5 para autenticarse, solo mostrará el correo electrónico, el nombre, el apellido y la dirección de perfil de google + del usuario. Usando el modo que se muestra aquí, también tendrá acceso al enlace de la imagen del usuario.
El contexto. La propiedad del usuario lleva una serialización JSON de los datos del usuario enviados a través del cable y tiene métodos útiles para permitir que el usuario encuentre una propiedad por su clave.
Para obtener más información sobre el concepto de ámbitos de inicio de sesión, consulte: https://developers.google.com/+/api/oauth#login-scopes
Here hay una buena respuesta de AndrewPolland. Trabaja para mi. Él usa el nuevo token de acceso oauth para recuperar la información del usuario después de iniciar sesión. Desde aquí, Deepak Goswami explica cómo usar esta llamada de API.