2017-07-23 1 views
7

J'ai modifié startup.Auth.cs afin que je puisse ajouter des étendues. Voici ce que j'ai:Comment obtenir l'adresse e-mail de l'utilisateur lors de l'utilisation de l'authentification de compte Microsoft dans un projet MVC?

MicrosoftAccountAuthenticationOptions mo = new MicrosoftAccountAuthenticationOptions() 
{ 
    ClientId = "My Client ID", 
    ClientSecret = "My Client Secret", 
}; 
app.UseMicrosoftAccountAuthentication(mo); 

Cela me permet d'authentifier l'utilisateur.

J'ai essayé d'ajouter les champs d'application wl.signin, wl.emails et wl.contacts_emails. Cependant, ils provoquent l'erreur suivante sur la page de connexion Microsoft: AADSTS70011: La valeur fournie pour le paramètre d'entrée 'scope' n'est pas valide. La portée wl.signin, wl.emails, wl.contacts_emails n'est pas valide. La combinaison de portée de openid et email semble fonctionner. Cependant, la portée openid est exagérée pour ce que j'essaie de faire. Autrement dit, je pense que c'est trop demander à l'utilisateur. La portée email tout par lui-même ne fonctionne pas.

Cela est particulièrement étrange car le modèle que Visual Studio configure suppose que le fournisseur d'authentification externe fournira une adresse électronique.

Comment obtenir uniquement l'adresse e-mail de l'utilisateur?

Pour le contexte, j'utilise les documents suivants: https://developer.microsoft.com/en-us/graph/docs/concepts/permissions_reference#openid-permissions qui donne l'impression que je veux email et profil inclus dans le champ d'application. Cependant, il continue à indiquer qu'ils sont inclus par défaut. J'essaie d'implémenter l'authentification externe dans mon projet MVC en utilisant le document: https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/microsoft-logins.

+0

Il s'agit d'une application Web ASP.Net (.Net Framework). Je vais essayer le tout avec une application Web ASP.Net Core (.Net Core). l'interface est légèrement différente, c'est-à-dire qu'elle utilise MicrosoftAccountOptions au lieu de MicrosoftAccountAuthenticationOptions. – JSWilson

Répondre

0

On dirait que vous devez utiliser ASP.Net de base application Web (.Net Framework) pour obtenir l'e-mail. Le code est similaire mais note: MicrosoftAccountOptions au lieu de MicrosoftAccountAuthenticationOptions. Curieusement, cela n'indique pas à l'utilisateur que vous recevez son adresse e-mail. J'ai Google, Facebook, Twitter, Microsoft & LinkedIn travaillant. Maintenant sur AccountKit pour les connexions par e-mail et SMS.

0

Vous pouvez utiliser le code suivant pour obtenir l'adresse électronique d'un utilisateur.

ClaimsPrincipal.Current.FindFirst(ClaimTypes.Name).Value.Split('#')[ClaimsPrincipal.Current.FindFirst(ClaimTypes.Name).Value.Split('#').Length - 1]; 
+0

J'ai essayé d'utiliser ceci dans ExternalLoginCallback. Cependant, il ne retourne rien. Je pense que le problème sous-jacent est que je ne sais pas comment obtenir l'email dans le cadre de la demande initiale.En conséquence, loginInfo ne contient pas les informations et je ne suis pas en mesure de le trouver n'importe où dans ClaimsPrincipal.Current. J'ai été en mesure d'ajouter un courriel à la portée de Facebook. Google a envoyé un e-mail par défaut. Dans le cas de Twitter, j'ai dû appeler leur API de vérification des identifiants pour l'obtenir (une solution que je n'aime pas mais je ne connais pas d'autre moyen d'obtenir l'email de Twitter). – JSWilson

1

Essayez d'ajouter des étendues:

MicrosoftAccountAuthenticationOptions mo = new MicrosoftAccountAuthenticationOptions() 
{ 
    ClientId = "My Client ID", 
    ClientSecret = "My Client Secret", 
}; 
mo.Scope.Add("openid"); 
mo.Scope.Add("email"); 
app.UseMicrosoftAccountAuthentication(mo); 
+0

Dans la question, vous remarquerez que j'ai essayé cela. Il demande l'autorisation d'accéder au courrier électronique des utilisateurs. Toutefois, l'e-mail n'est pas retourné dans loginInfo ou ClaimsPrincipal.Current. Comment puis-je récupérer l'e-mail? – JSWilson

+0

Facebook et Google retournent l'email dans loginInfo. Où est-ce que Microsoft l'a mis? – JSWilson