I've dibuat baru MVC5 Aplikasi Web, dan ketika saya mencoba untuk login dengan Google atau Facebook, yang ExternalLoginCallback
Tindakan AccountController
disebut, tapi GetExternalLoginInfoAsync()
selalu mengembalikan nilai null:
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();
if (loginInfo == null)
{
return RedirectToAction("Login");
}
Karena itu's selalu null, itu hanya pengalihan kembali ke halaman login dan proses dimulai lagi. Bagaimana saya bisa memperbaiki ini?
Untuk mendapatkan OWIN Google login untuk bekerja dengan baik pada standar Visual Studio 2013, ASP.Net MVC5 situs, saya harus:
Setup Google OpenId akun di https://console.developers.google.com/project
Set callback URL yang ada untuk bla/signin-google
.
catatan Penting tentang hal-hal yang anda don't perlu anda lakukan:
Anda don't perlu menggunakan HTTPS untuk Google untuk mengarahkan kembali; anda bahkan dapat mengarahkan kembali ke plain http://localhost, tidak ada masalah.
Anda don't perlu mengatur apa-apa untuk redirect URL - tidak ada rute, Controller Tindakan atau izin khusus di Web.Config. URL redirect adalah selalu /signin-google dan OWIN menangani ini di belakang layar untuk anda.
Sebagai contoh, jika situs anda me.com anda mungkin memiliki 3 callback Url di Konsol Pengembang Google:
http://localhost:53859/signin-google
http://test.me.com/signin-google
https://me.com/signin-google
Yang pertama termasuk dengan nomor port VS memberikan anda untuk proyek anda.
/akun/ExternalLoginCallback
termasuk &error=access_denied
, dan yang's karena Google mengatakan tidak untuk permintaan izin OWIN dibuat untuk pengguna's Google+ profil dasar. Saya dapat't memberitahu dan kesalahan ini, Google's atau Microsoft's.Untuk mengaktifkan Google+ API di Konsol, klik Api di sebelah kiri, berburu untuk Google+, klik dan tekan Aktifkan. Ya, anda benar-benar perlu untuk melakukannya. Anda're disemprot jika anda don't melakukan itu.
var google = new GoogleOAuth2AuthenticationOptions() { ClientId = "123abc.apps.googleusercontent.com", ClientSecret = "456xyz", Provider = new GoogleOAuth2AuthenticationProvider() }; google.Ruang lingkup.Tambahkan("email"); aplikasi.UseGoogleAuthentication(google);
Yang's ini. Yang akhirnya mendapatkannya bekerja.
Hanya ingin tegaskan sekali lagi, ada BANYAK jawaban tentang hal ini dan isu-isu seperti itu di mana OWIN/Google isn't bekerja, dan hampir semua dari mereka yang salah untuk saat ini VS2013/MVC5/OWIN template.
Anda don't perlu untuk memodifikasi Web.Konfigurasi sama sekali.
Anda don't perlu membuat Rute khusus apapun.
Anda tidak harus berusaha untuk titik /signin-google
ke tempat yang berbeda, atau menggunakan callback URL, dan anda pasti tidak't mencoba untuk mengikat langsung ke /akun/externallogincallback
atau externalloginconfirmation
, karena mereka berdua terpisah dari /signin-google
dan langkah-langkah yang diperlukan dalam OWIN/Google proses.
OK, sekarang aku tahu kenapa itu's null. Anda harus mengaktifkan Google + API di konsol Google. Juga pastikan kunci rahasia tidak bersambung dengan ruang di akhir setelah anda paste ke kode anda. Mengapa bisa't mereka kembali normal error? Saya don't tahu.
Tampaknya bahwa Nuget package Microsoft.Owin.Keamanan.Facebook versi 3.0.1 tidak lagi bekerja dengan Facebook Login.
Update paket ini untuk pra-rilis versi 3.1.0, anda dapat menggunakan berikut:
Install-Paket Microsoft.Owin.Keamanan.Facebook -Pre
Seperti orang-orang lain dengan benar menyebutkan, sebagian besar waktu yang's karena anda tidak memiliki izin untuk API Google+ jadi di sini adalah bagaimana untuk mendapatkan izin untuk proyek di Google API Manager ke Google+ API
Langkah 1. Pilih Proyek Anda dari atas combobox dan pergi ke Dasbor > Aktifkan API
Langkah 2: Pencarian untuk Google plus dan pilih
jika anda kembali ke dashboard untuk proyek itu anda bisa melihat daftar diaktifkan API's untuk proyek yang di bawah
Ini memecahkan masalah saya:
Aktifkan API Google+. Ini adalah gotcha dan adalah akar penyebab dari masalah dalam pertanyaan di sini - jika anda don't melakukan hal ini, it's mudah untuk melewatkan bahwa Permintaan untuk /akun/ExternalLoginCallback
termasuk &error=access_denied
, dan yang's karena Google mengatakan tidak untuk permintaan izin OWIN dibuat untuk pengguna's Google+ profil dasar. Saya dapat't memberitahu dan kesalahan ini, Google's atau Microsoft's.
Untuk aktifkan API Google+ di Konsol, klik Api di sebelah kiri, berburu untuk Google+, klik dan tekan Aktifkan.
Aku berlari ke dalam masalah ini hari ini dan ternyata saya mendefinisikan remote cookie setelah saya ditugaskan penyedia.
Pastikan anda menempatkan...
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
sebelum...
app.UseFacebookAuthentication(
appId: "",
appSecret: "");
Bagi mereka yang mengalami masalah ini untuk Web Api. Solusi lain tidak membantu AuthenticationManager.GetExternalLoginInfoAsync();
kembali selalu null bahkan google plus api diaktifkan.
menggunakan fungsi kustom ini untuk mendapatkan logininfo. jelas Microsoft memiliki bug untuk GetExternalLoginInfoAsync ketika meminta lebih dari web api.
private async Task<ExternalLoginInfo> AuthenticationManager_GetExternalLoginInfoAsync_WithExternalBearer()
{
ExternalLoginInfo loginInfo = null;
var result = await Authentication.AuthenticateAsync(DefaultAuthenticationTypes.ExternalBearer);
if (result != null && result.Identity != null)
{
var idClaim = result.Identity.FindFirst(ClaimTypes.NameIdentifier);
if (idClaim != null)
{
loginInfo = new ExternalLoginInfo()
{
DefaultUserName = result.Identity.Name == null ? "" : result.Identity.Name.Replace(" ", ""),
Login = new UserLoginInfo(idClaim.Issuer, idClaim.Value)
};
}
}
return loginInfo;
}
Setelah lama mencari dan kepala menggaruk serta mengikuti berbagai red herring jawaban di sini di Stackoverflow saya akhirnya pergi melalui semua pilihan saya di Google dev console dan menemukan sedikit biru [Enable] tombol pada Google+API ikhtisar halaman. Saya mengklik ini dan hey presto bekerja. Lupakan semua omong kosong anda baca tentang callback url dan rute konfigurasi, OWIN menimpa google default /signin-google redirect uri dalam hal apapun dan mengirimkan anda kembali ke ExternalLoginCallback. Hanya menempel dengan implementasi standar semua akan baik selama anda mengaktifkan Google+API.
Meskipun jawaban atas semua baik, dalam contoh saya tidak satupun dari mereka bekerja - I'd diperiksa dan diperiksa setelan Google dan setuju dengan Chris Moschini yang ada's banyak info menyesatkan.
Bagi saya itu adalah 'doh saat ketika saya menyadari bahwa saya Keluar dari Proses layanan negara itu tidak dimulai! Tidak ada kesalahan (sebagai login adalah hal pertama yang saya mencoba setelah reboot mana negara diatur ke manual start-up pada mesin) hanya Null dari GetExternalLoginInfoAsync
Semoga ini bisa membantu orang lain keluar.
Saya ingin berkontribusi untuk yang satu ini juga. Aku hanya baru-baru ini bekerja. Aku punya masalah dengan GetExternalLoginInfoAsync kembali null tetapi hanya di produksi.
Setelah mencari akhirnya saya menemukan jawaban saya itu hanya masalah dengan database saya. Di produksi saya telah menetapkan salah string koneksi tidak terhubung dengan benar tetapi pada dasarnya diam tentang hal itu. Satu-satunya hal yang terjadi adalah GetExternallLoginInfoAsync kembali nol. Jadi anda string koneksi database jika hal ini terjadi!
Juga pada sidenote, satu-satunya hal yang diperlukan untuk mendapatkan kerja ini adalah:
Anda tidak perlu mengaktifkan HTTPS, anda tidak harus membuat rute kustom. Tapi pastikan database anda bekerja dengan benar!
Bagi saya, saya adalah migrasi dan lama bekerja .NET 4.6.1 MVC web untuk inti 1.1. Pekerjaan berhenti sebelum aku bisa mendapatkannya bekerja, ketika aku memungutnya kembali, saya kemudian bermigrasi ke 2.x.
Masalah saya adalah bahwa callback dari Google bertemu dengan 404
dari situs saya. Saya pikir itu seharusnya untuk memukul AccountController.ExternalLoginCallback
jadi saya menambahkan [Rute(...)]
untuk itu dan cukup yakin, Google's callback memukul tindakan.
Hal ini kemudian memukul null
kembali di baris ini (apa jenis maniak kembali null
?)
var externalLoginInfo = await this.SignInManager.GetExternalLoginInfoAsync();
Aku membalikkan direkayasa untuk menemukan di bawah tenda yang pada akhirnya mendapatkan handler untuk ExternalScheme
yang bagi saya adalah kue handler!
Itu semua tampak salah dan aku merasa entah bagaimana bahwa middleware seharusnya hanya mencegat panggilan balik URI jadi saya dihapus saya [Rute(...)]
dan 404
masalah datang kembali.
Saya kemudian menemukan bahwa saya perlu menambahkan ini selama startup.
applicationBuilder.UseAuthentication();
Ini memecahkan 404
tetapi memberikan masalah lain.
Tidak ada authenticationScheme ditentukan, dan tidak ada DefaultSignInScheme ditemukan.
Dengan menambahkan default skema di sini, saya mengatasi kesalahan di atas.
serviceCollection.AddAuthentication(IdentityConstants.ExternalScheme)
.AddGoogle(googleOptions => Configuration.Bind("OAuth2:Providers:Google", googleOptions))
.AddExternalCookie();
Sekarang AccountController.ExternalLoginCallback
dipanggil lagi oleh beberapa sihir tapi aku kembali ke null
nilai kembali.
Saya menambahkan kode ini di atas garis menyinggung, yang pada dasarnya adalah apa yang terjadi di bawah kap mesin (melihat Microsoft's code di GitHub). Menariknya, h
adalah jenis CookieAuthenticationHandler
dan a
memiliki semua yang saya klaim dan informasi dari Google dalam!
var authHandler = this.HttpContext.RequestServices.GetRequiredService<IAuthenticationHandlerProvider>();
var h = await authHandler.GetHandlerAsync(this.HttpContext, IdentityConstants.ExternalScheme);
var a = await h.AuthenticateAsync();
var externalLoginInfo = await this.SignInManager.GetExternalLoginInfoAsync();
Menggali ke GitHub dan copy paste kode internal yang berjalan ke controller, saya dapat melihat bahwa itu's gagal untuk menemukan ClaimTypes.NameIdentifier
di klaim saya, ini adalah ProviderKey
digunakan nanti.
Hmm....
Prihatin saya menggunakan lama 1.x AccountController
kode dengan yang lebih baru 2.x identitas bit aku menemukan beberapa sampel yang masih menggunakan hal-hal ini, dan beberapa sampel yang menggunakan pisau Cukur Halaman untuk semua itu, terlalu. I'll tetap dengan apa yang saya miliki.
Jadi saya'm berikutnya akan menyelidiki pemetaan tambahan pengguna Google JSON muatan barang-barang ke dalam klaim. Saya pikir jika saya akun Google ID (numerik, saya kira) dipetakan maka semuanya akan bekerja.
Akhir Perbaikan
Saya akhirnya menyelesaikan masalah ini dengan menambahkan "klaim aksi" untuk menarik saya Google pengenal keluar dari JSON datang kembali dari Google!
serviceCollection.AddAuthentication(IdentityConstants.ExternalScheme)
.AddGoogle(googleOptions =>
{
Configuration.Bind("OAuth2:Providers:Google", googleOptions);
googleOptions.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "sub", "string");
})
.AddExternalCookie();
The sub
field berisi apa yang akhirnya berakhir di nameidentifier
klaim dan kemudian ke ProviderKey
bahwa AccountController
ingin.
Memang benar bahwa anda akan perlu Google plus Diaktifkan. Hal yang besar bagi saya adalah proyek URL. Buka jendela properties (Lihat -> Jendela Properti) di LENSA dan kemudian klik kanan project dan pilih properties. Kecil di jendela properties copy SSL anda URL, dan kemudian yang lebih besar jendela properties pilih tab Web dan paste URL tersebut di URL Proyek.
Tetap masalah untuk saya.
Melihat secara lebih detail: https://docs.microsoft.com/en-us/aspnet/mvc/overview/security/create-an-aspnet-mvc-5-app-with-facebook-and-google-oauth2-and-openid-sign-on
Semua jawaban yang lain tidak't memecahkan masalah ini bagi saya, jadi jika anda di perahu yang sama maka pastikan anda pendaftaran aksi controller memiliki RequireHttps atribut:
// GET: /Account/LoginRegister
[AllowAnonymous]
[RequireHttps]
public ActionResult LoginRegister()
{
return View(new RegisterLoginViewModel());
}