2013-11-23 2 views
7

Я использую mvc5 + C#, и я предоставляю моему пользователю возможность входа на мой сайт с внешним логином (facebook, google, ...).Получить адрес электронной почты учетной записи Microsoft Live

Я пытаюсь добавить Microsoft Live в качестве нового поставщика. Но я не вижу возможности получить адрес электронной почты подключенного пользователя.

Я Получение этих претензий, когда некоторые-Microsoft-пользователь подключения («KEY | VALUE»):

http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier | ***************** 
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name | test 
http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider | ASP.NET Identity 
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier | ************** 
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name | **************** 
urn:microsoftaccount:id | **************** 
urn:microsoftaccount:name | **************** 
urn:microsoftaccount:access_token | ************************************************************** 

Есть ли возможность получить адрес электронной почты пользователя, используя эту информацию?

+0

Короткий ответ: [нет] (http://stackoverflow.com/questions/3170341/does-hotmail-or-windows-live-id-support-openid-authentication/6990971#6990971) – Bora

+0

В отличие от форумов, мы не используйте «Спасибо», или «Любая помощь оценена», или подписи на [so]. См. «[Должны ли« Привет »,« спасибо », теги и приветствия удалены из сообщений?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be -removed-from-posts). –

ответ

12

Да, есть. После нескольких часов безуспешных попыток мне удалось получить его работу, как это:

код в startup.Auth.cs

var ms = new Microsoft.Owin.Security.MicrosoftAccount.MicrosoftAccountAuthenticationOptions(); 
ms.Scope.Add("wl.emails"); 
ms.Scope.Add("wl.basic"); 
ms.ClientId = "xxxxxxxxxxxxxxxxxxxxxx"; 
ms.ClientSecret = "yyyyyyyyyyyyyyyyyyyyy"; 
ms.Provider = new Microsoft.Owin.Security.MicrosoftAccount.MicrosoftAccountAuthenticationProvider() 
{ 
    OnAuthenticated = async context => 
    { 
     context.Identity.AddClaim(new System.Security.Claims.Claim("urn:microsoftaccount:access_token", context.AccessToken)); 

     foreach (var claim in context.User) 
     { 
      var claimType = string.Format("urn:microsoftaccount:{0}", claim.Key); 
      string claimValue = claim.Value.ToString(); 
      if (!context.Identity.HasClaim(claimType, claimValue)) 
       context.Identity.AddClaim(new System.Security.Claims.Claim(claimType, claimValue, "XmlSchemaString", "Microsoft")); 
     } 
    } 
}; 

app.UseMicrosoftAccountAuthentication(ms); 

Код в AccountController.cs, в функции ExternalLoginCallback, чтобы получить адрес электронной почты:

string Email = string.Empty; 

var externalIdentity = await AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie); 
var emailClaim = externalIdentity.Claims.FirstOrDefault(x => x.Type.Equals(
                "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress", 
                StringComparison.OrdinalIgnoreCase)); 
Email = emailClaim == null ? null : emailClaim.Value; 
+0

Отличный ответ, к сожалению, для меня мой проект в MVC4, и мы не используем OWin, а Oauth, так что у вас есть аналогичное решение для Oauth? – Jay

0

для тех, кто работает в этом вопросе с добавлением логин Microsoft на сайте:

я обнаружил, что я могу только получить адрес электронной почты моего Учетная запись Microsoft Work/School. Я сделал учетную запись Microsoft с моим адресом @ gmail.com и адресом, который является @ outlook.com. У обоих нет никакой электронной почты, связанной при запросе их информации. Тем не менее, для соответствующих адресов, вы можете получить информацию по электронной почте, делая запрос GET на:

https://apis.live.net/v5.0/me?access_token=ACCESS_TOKEN

Где access_token является то, что аутентифицированный пользователь предоставит вам *. Для получения более подробной информации об этом API-интерфейсе, вы можете увидеть эту ссылку: https://msdn.microsoft.com/en-us/library/office/dn659736.aspx

В принципе, вызов в Microsoft Live API (apis.live.net) предоставит вам информацию, которую пользователь предоставил вам (так если вы включили область wl.emails в своем приложении, вы должны увидеть их адрес электронной почты).

* Кроме того, когда пользователь регистрируется на вашем сайте с помощью входа в систему Microsoft, их запросы на ваш сайт будут иметь заголовок, который содержит как токен доступа, так и, возможно, их адрес электронной почты (адрес электронной почты находится под заголовком «X-MS» -CLIENT-PRINCIPAL-NAME ", токен доступа также находится в заголовках HTTP в разделе« X-MS-TOKEN-MICROSOFT-ACCESS-TOKEN »).

Смежные вопросы