Pertanyaan Dapatkan ExtraData dari kerangka MVC5 OAuth / OWin penyedia identitas dengan penyedia auth eksternal


Saya mencoba menggunakan framework MVC5 baru di pratinjau VS 2013.

Kerangka kerja otentikasi keanggotaan telah dirombak dan diganti dengan OWin.

Secara khusus, saya mengaktifkan autentikasi penyedia eksternal autentikasi Google.

Itu sangat mudah dilakukan.

Cukup hapus tanda komentar baris ini: app.UseGoogleAuthentication(); di file Startup.Auth.cs di direktori App_Start dari proyek MVC default yang baru.

Jadi, saya ingin mengakses "Data Ekstra" yang berasal dari penyedia Otentikasi, seperti url ke avatar pengguna untuk ditampilkan di aplikasi saya.

Di bawah penerapan OAuth yang lebih lama terhadap penyedia Keanggotaan asp.net, ada cara untuk menangkap ini menggunakan kamus ExtraData ini di sini: ProviderDetail.ExtraData Properti.

Saya tidak dapat menemukan banyak dokumentasi tentang bagaimana OAuth dan OWin bekerja bersama dan bagaimana mengakses data tambahan ini.

Adakah yang bisa mencerahkan saya?


30
2017-07-30 02:56


asal


Jawaban:


Baru-baru ini saya harus mendapatkan akses ke gambar profil Google juga dan di sini adalah bagaimana saya menyelesaikannya ...

Jika Anda hanya mengaktifkan kode app.UseGoogleAuthentication(); dalam file Startup.Auth.cs itu tidak cukup karena dalam hal ini Google tidak mengembalikan informasi tentang gambar profil sama sekali (atau saya tidak tahu bagaimana cara mendapatkannya).

Yang Anda perlukan adalah menggunakan integrasi OAuth2 alih-alih Open ID yang diaktifkan secara default. Dan inilah cara saya melakukannya ...

Pertama-tama Anda harus mendaftarkan aplikasi Anda di sisi Google dan mendapatkan "ID Klien" dan "Rahasia klien". Segera setelah ini selesai Anda dapat melangkah lebih jauh (Anda akan membutuhkannya nanti). Informasi detail bagaimana melakukan ini sini.

Menggantikan app.UseGoogleAuthentication(); dengan

    var googleOAuth2AuthenticationOptions = new GoogleOAuth2AuthenticationOptions
    {
        ClientId = "<<CLIENT ID FROM GOOGLE>>",
        ClientSecret = "<<CLIENT SECRET FROM GOOGLE>>",
        CallbackPath = new PathString("/Account/ExternalGoogleLoginCallback"),
        Provider = new GoogleOAuth2AuthenticationProvider() {
            OnAuthenticated = async context =>
            {
                context.Identity.AddClaim(new Claim("picture", context.User.GetValue("picture").ToString()));
                context.Identity.AddClaim(new Claim("profile", context.User.GetValue("profile").ToString()));
            }
        }
    };

    googleOAuth2AuthenticationOptions.Scope.Add("email");

    app.UseGoogleAuthentication(googleOAuth2AuthenticationOptions);

Setelah itu Anda dapat menggunakan kode untuk mendapatkan akses ke URL gambar profil dengan cara yang sama seperti untuk properti lainnya

var externalIdentity = HttpContext.GetOwinContext().Authentication.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
var pictureClaim = externalIdentity.Result.Claims.FirstOrDefault(c => c.Type.Equals("picture"));
var pictureUrl = pictureClaim.Value;

17
2018-03-27 17:02



Dengan Versi RTW identitas asp.net kode berikut di ExternalLoginCallback melakukan itu untukku.

var externalIdentity = await HttpContext.GetOwinContext().Authentication
    .GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
var displayName = externalIdentity.Name;
var email = externalIdentity.FindFirstValue(ClaimTypes.Email);

7
2017-10-17 10:15



Dengan menggunakan jawaban Alex Wheat, saya menemukan solusi untuk mengambil kembali profil google +, jenis kelamin dan email menggunakan Google Authentication.

Startup.Auth.cs:

var googleOptions = new GoogleOAuth2AuthenticationOptions()
{
    ClientId = "<<client id - google>>",
    ClientSecret = "<<secret for your app>>",
    Provider = new GoogleOAuth2AuthenticationProvider()
    {
        OnAuthenticated = context =>
        {
            var userDetail = context.User;
            context.Identity.AddClaim(new Claim(ClaimTypes.Name,context.Identity.FindFirstValue(ClaimTypes.Name)));
            context.Identity.AddClaim(new Claim(ClaimTypes.Email,context.Identity.FindFirstValue(ClaimTypes.Email)));

            var gender = userDetail.Value<string>("gender");
            context.Identity.AddClaim(new Claim(ClaimTypes.Gender, gender));

            var picture = userDetail.Value<string>("picture");
            context.Identity.AddClaim(new Claim("picture", picture));

            return Task.FromResult(0);
        },
    },
};
googleOptions.Scope.Add("https://www.googleapis.com/auth/plus.login");
googleOptions.Scope.Add("https://www.googleapis.com/auth/userinfo.email");

app.UseGoogleAuthentication(googleOptions);

Untuk mendapatkan akses ke data profil yang diperluas, Anda harus menambahkan dua cakupan ke permintaan - plus.login dan userinfo.email. Jika Anda hanya menambahkan lingkup plus.login, Anda tidak akan dapat melihat email pengguna. Jika Anda menggunakan template default ASP.NET MVC5 untuk mengotentikasi, hanya akan menampilkan alamat e-mail, nama, nama pengguna, dan google + pengguna. Dengan menggunakan cara yang ditunjukkan di sini, Anda akan memiliki akses ke tautan gambar pengguna.

Konteks. Properti pengguna membawa serialisasi JSON dari data pengguna yang dikirim melalui kabel dan memiliki metode yang berguna untuk memungkinkan pengguna menemukan properti berdasarkan kuncinya.

Untuk mempelajari lebih lanjut tentang konsep cakupan masuk, silakan lihat: https://developers.google.com/+/api/oauth#login-scopes


5
2018-06-26 14:16



Berikut postingan detail tentang bagaimana Anda bisa mendapatkan data tambahan dari penyedia sosial http://blogs.msdn.com/b/webdev/archive/2013/10/16/get-more-information-from-social-providers-used-in-the-vs-2013-project-templates.aspx


4
2017-10-18 13:53



Berikut ini berfungsi untuk saya untuk facebook:

StartupAuth.cs:

var facebookAuthenticationOptions = new FacebookAuthenticationOptions()
{
    AppId = "x",
    AppSecret = "y"
};
facebookAuthenticationOptions.Scope.Add("email");
app.UseFacebookAuthentication(facebookAuthenticationOptions);

Metode ExternalLoginCallback:

var externalIdentity = HttpContext.GetOwinContext().Authentication.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
var emailClaim = externalIdentity.Result.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email);
var email = emailClaim.Value;

Dan untuk Google:

StartupAuth.cs

app.UseGoogleAuthentication();

Metode ExternalLoginCallback (sama seperti untuk facebook):

var externalIdentity = HttpContext.GetOwinContext().Authentication.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
var emailClaim = externalIdentity.Result.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email);
var email = emailClaim.Value;

Jika saya mengatur breakpoint di sini:

var email = emailClaim.Value;

Saya melihat alamat email untuk kedua facebook dan Google di debugger.

Memperbarui: Lihat pos ini untuk solusi yang tepat dan lengkap; Mendapatkan email dari penyedia eksternal Google dan Facebook selama tahap asosiasi akun dalam aplikasi MVC5 default


4
2018-01-08 10:47



Jadi sayangnya ini tidak super lugas, salah satu cara yang dapat Anda lakukan adalah dengan mengaitkan acara Autentikasi GoogleProvider dan menambahkan klaim khusus ke Identitas Klaim dengan avatar:

public class MyGoogleProvider : GoogleAuthenticationProvider {
    public override Task Authenticated(GoogleAuthenticatedContext context) {
        context.Identity.AddClaim(new Claim("avatarClaim", "<fetch avatar url here>"));
        return base.Authenticated(context);
    }
}

app.UseGoogleAuthentication(new GoogleAuthenticationOptions() { Provider = new MyGoogleProvider() });

Kemudian di dalam AccountController Anda, ketika identitas eksternal diekstraksi, Anda dapat mengambil klaim avatar ini dan menyimpannya ke objek pengguna Anda untuk digunakan nanti.


3
2017-09-16 17:35



Sini  adalah jawaban yang bagus dari AndrewPolland. Bekerja untukku. Dia menggunakan token akses oauth yang baru untuk mengambil info pengguna setelah login. Dari sini Deepak Goswami menjelaskan cara menggunakan panggilan api ini.


0
2018-03-25 00:12