2017-07-23 12 views
7

Tôi đã sửa đổi startup.Auth.cs để tôi có thể thêm phạm vi. Dưới đây là những gì tôi có:Làm cách nào để nhận email của người dùng khi sử dụng Xác thực tài khoản Microsoft trong dự án MVC?

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

Điều này cho phép tôi xác thực người dùng.

Tôi đã thử thêm các phạm vi wl.signin, wl.emailswl.contacts_emails. Tuy nhiên, chúng khiến trang đăng nhập của Microsoft báo cáo lỗi sau: AADSTS70011: Giá trị được cung cấp cho tham số đầu vào 'phạm vi' không hợp lệ. Phạm vi wl.signin, wl.emails, wl.contacts_emails không hợp lệ. Kết hợp phạm vi của openidemail dường như hoạt động. Tuy nhiên, phạm vi openid là quá mức cần thiết cho những gì tôi đang cố gắng thực hiện. Đó là, tôi nghĩ rằng đó là quá nhiều để yêu cầu từ người sử dụng. Phạm vi email tất cả đều tự nó không hoạt động.

Điều này đặc biệt kỳ lạ vì mẫu mà Visual Studio thiết lập giả định rằng nhà cung cấp xác thực bên ngoài sẽ cung cấp địa chỉ email.

Làm cách nào để chỉ nhận được email của người dùng?

Đối với bối cảnh, tôi đang sử dụng các tài liệu sau: https://developer.microsoft.com/en-us/graph/docs/concepts/permissions_reference#openid-permissions mà cho ấn tượng mà tôi muốn emailhồ sơ bao gồm trong phạm vi. Tuy nhiên, nó đi vào trạng thái rằng chúng được bao gồm theo mặc định.

Tôi đang cố triển khai xác thực bên ngoài trong dự án MVC của mình bằng tài liệu: https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/microsoft-logins.

+0

Đây là ứng dụng web ASP.Net (.Net Framework). Tôi sẽ thử toàn bộ điều với một ứng dụng Web ASP.Net Core (.Net Core). giao diện hơi khác một chút, tức là nó sử dụng MicrosoftAccountOptions thay vì MicrosoftAccountAuthenticationOptions. – JSWilson

Trả lời

0

Hình như bạn phải sử dụng ASP.Net Lõi Web Application (.Net Framework) để nhận được email. Mã này tương tự nhưng lưu ý: MicrosoftAccountOptions thay vì MicrosoftAccountAuthenticationOptions.

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

Điều này vô tình sẽ không thông báo cho người dùng rằng bạn đang nhận địa chỉ email của họ. Tôi có Google, Facebook, Twitter, Microsoft & LinkedIn hoạt động. Bây giờ vào AccountKit cho đăng nhập email và tin nhắn SMS.

0

Bạn có thể sử dụng mã sau để lấy địa chỉ email của người dùng.

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

Tôi đã cố gắng sử dụng điều này trong ExternalLoginCallback. Tuy nhiên, nó không trả lại bất cứ điều gì. Tôi nghĩ rằng vấn đề cơ bản là tôi không biết làm thế nào để có được email trong phạm vi của yêu cầu ban đầu.Kết quả là loginInfo không chứa thông tin và tôi không thể tìm thấy nó ở bất kỳ đâu trong ClaimsPrincipal.Current. Tôi đã có thể thêm email vào phạm vi của Facebook. Theo mặc định, Google đã gửi email. Trong trường hợp của Twitter tôi đã phải gọi API xác minh thông tin đăng nhập của họ để có được nó (một giải pháp tôi không thích nhưng, tôi không biết bất kỳ cách nào khác để nhận được email từ Twitter). – JSWilson

1

Cố gắng thêm phạm vi:

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

Trong câu hỏi, bạn sẽ lưu ý rằng tôi đã thử điều đó. Nó yêu cầu quyền truy cập vào email của người dùng. Tuy nhiên, email không được trả lại trong loginInfo hoặc ClaimsPrincipal.Current. Làm cách nào để truy xuất email? – JSWilson

+0

Facebook và Google trả lại email trong loginInfo. Microsoft đặt nó ở đâu? – JSWilson

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