2017-07-23 46 views
7

Zmodyfikowałem startup.Auth.cs, dzięki czemu mogłem dodać zakresy. Oto, co mam:Jak uzyskać adres e-mail użytkownika podczas korzystania z uwierzytelniania konta Microsoft w projekcie MVC?

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

To pozwala mi uwierzytelnić użytkownika.

Próbowałem dodawanie zakresów wl.signin, wl.emails i wl.contacts_emails. Jednak powodują one, że strona logowania firmy Microsoft zgłasza następujący błąd: AADSTS70011: Podana wartość parametru wejściowego "zasięg" jest niepoprawna. Zakres wl.signin, wl.emails, wl.contacts_emails jest nieprawidłowy. Kombinacja zakresu openid i e-mail wydaje się działać. Jednakże zakres openID jest przesadny, jeśli chodzi o to, co próbuję zrobić. To znaczy, myślę, że to zbyt wiele, aby zapytać użytkownika. Zakres przez to samo nie działa.

Jest to szczególnie dziwne, ponieważ szablon skonfigurowany przez Visual Studio zakłada, że ​​zewnętrzny dostawca uwierzytelnienia dostarczy adres e-mail.

Jak mogę otrzymać tylko wiadomość e-mail użytkownika?

Dla kontekście używam następujące dokumenty: https://developer.microsoft.com/en-us/graph/docs/concepts/permissions_reference#openid-permissions co daje wrażenie, że chcę email i profil jest objęta zakresem. Dodaje jednak, że są one domyślnie włączone.

Próbuję zaimplementować uwierzytelnianie zewnętrzne w moim projekcie MVC za pomocą dokumentu: https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/microsoft-logins.

+0

To jest aplikacja sieci Web ASP.Net (.Net Framework). Mam zamiar wypróbować całość z aplikacją ASP.Net Core (.Net Core). interfejs jest nieco inny, tzn. używa MicrosoftAccountOptions zamiast MicrosoftAccountAuthenticationOptions. – JSWilson

Odpowiedz

0

Wygląda na to trzeba użyć ASP.Net Rdzeń Web Application (.NET Framework) dostać e-mail. Kod jest podobny, ale uwaga:: MicrosoftAccountOptions zamiast MicrosoftAccountAuthenticationOptions.

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

Co ciekawe, nie informuje użytkownika o tym, że otrzymujesz jego adres e-mail. Mam działające Google, Facebook, Twitter, Microsoft & LinkedIn. Teraz przejdź do konta AccountKit w celu zalogowania się do e-maili i SMS-ów.

0

Możesz użyć następującego kodu, aby uzyskać adres e-mail użytkownika.

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

Próbowałem użyć tego w ExternalLoginCallback. Jednak nic nie zwraca. Myślę, że podstawową kwestią jest to, że nie wiem, jak uzyskać e-mail w zakresie pierwotnego wniosku.W rezultacie loginInfo nie zawiera informacji i nie jestem w stanie znaleźć go nigdzie w pliku ClaimsPrincipal.Current. Udało mi się dodać e-mail do zakresu Facebooka. Domyślnie Google miał adres e-mail. W przypadku Twittera musiałem zadzwonić do ich API weryfikacji poświadczeń, aby go otrzymać (rozwiązanie, którego nie lubię, ale nie znam innego sposobu na otrzymanie wiadomości z Twittera). – JSWilson

1

Spróbuj dodać zakresy:

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

W pytaniu możesz zauważyć, że próbowałem tego. Pyta o pozwolenie na dostęp do poczty e-mail użytkowników. Jednak e-mail nie jest zwracany w loginInfo lub ClaimsPrincipal.Current. Jak mogę pobrać wiadomość e-mail? – JSWilson

+0

Facebook i Google zwracają wiadomość e-mail w loginInfo. Gdzie Microsoft to umieścił? – JSWilson