2013-11-23 19 views
7

Tôi đang sử dụng mvc5 + C# và tôi cung cấp cho người dùng tùy chọn đăng nhập vào trang web của mình bằng thông tin đăng nhập bên ngoài (facebook, google, ...).Nhận địa chỉ email của tài khoản Microsoft Live

Tôi đang cố gắng thêm Microsoft Live làm nhà cung cấp mới. Tuy nhiên, tôi không thấy bất kỳ tùy chọn nào để nhận địa chỉ email của người dùng được kết nối.

Tôi Bắt những tuyên bố khi một số-microsoft-user là connect ("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 | ************************************************************** 

Có bất kỳ tùy chọn để có được địa chỉ email của người dùng, sử dụng thông tin này?

+0

Câu trả lời ngắn: [không] (http://stackoverflow.com/questions/3170341/does-hotmail-or-windows-live-id-support-openid-authentication/6990971#6990971) – Bora

+0

Không giống như trang web diễn đàn, chúng tôi không sử dụng "Cảm ơn" hoặc "Bất kỳ trợ giúp nào được đánh giá cao" hoặc chữ ký trên [để]. Xem "[Nên 'Xin chào', 'cảm ơn', dòng giới thiệu và lời chào được xóa khỏi bài đăng không?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be –

Trả lời

12

Có, có. Sau nhiều giờ cố gắng tôi quản lý để làm cho nó làm việc như thế này:

Mã trong 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); 

Mã trong AccountController.cs, trong chức năng ExternalLoginCallback để lấy địa chỉ email:

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

Câu trả lời tuyệt vời, không may cho tôi dự án của tôi là trong MVC4 và chúng tôi không sử dụng OWin nhưng Oauth, vì vậy bạn có một giải pháp tương tự cho Oauth? – Jay

0

Đối với bất cứ ai chạy vào vấn đề này với việc thêm một tên đăng nhập Microsoft vào trang web của bạn:

tôi thấy rằng tôi chỉ có thể nhận địa chỉ email của tôi Tài khoản Microsoft Work/School. Tôi đã tạo một tài khoản Microsoft với địa chỉ @ gmail.com của mình và một tài khoản là @ outlook.com. Cả hai đều không có bất kỳ thông tin email nào được liên kết khi tôi truy vấn thông tin của họ. Tuy nhiên, đối với các địa chỉ đủ điều kiện, bạn có thể nhận được thông tin email bằng cách thực hiện một yêu cầu GET đến:

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

đâu ACCESS_TOKEN là điều mà một người dùng xác thực sẽ cung cấp cho bạn *. Để biết thêm thông tin về API này, bạn có thể thấy liên kết này: https://msdn.microsoft.com/en-us/library/office/dn659736.aspx

Về cơ bản, thực hiện cuộc gọi đến Microsoft Live API (apis.live.net) sẽ cung cấp cho bạn thông tin mà người dùng đã cấp cho bạn quyền truy cập (vì vậy nếu bạn đã bật phạm vi wl.emails trong ứng dụng của mình, bạn sẽ thấy địa chỉ email của họ). Ngoài ra, khi người dùng đăng nhập vào trang web của bạn bằng thông tin đăng nhập của Microsoft, yêu cầu của họ đến trang web của bạn sẽ có tiêu đề chứa cả mã thông báo truy cập và địa chỉ email của họ (địa chỉ email nằm dưới tiêu đề "X-MS" -CLIENT-PRINCIPAL-NAME ", mã thông báo truy cập cũng nằm trong tiêu đề HTTP trong" X-MS-TOKEN-MICROSOFT-ACCESS-TOKEN ").

Các vấn đề liên quan