Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
oleh Rick Anderson
Tutorial ini menunjukkan kepada Anda cara membuat aplikasi web ASP.NET MVC 5 yang memungkinkan pengguna untuk masuk menggunakan OAuth 2.0 dengan kredensial dari penyedia autentikasi eksternal, seperti Facebook, Twitter, LinkedIn, Microsoft, atau Google. Untuk kesederhanaan, tutorial ini berfokus pada bekerja dengan kredensial dari Facebook dan Google.
Mengaktifkan kredensial ini di situs web Anda memberikan keuntungan yang signifikan karena jutaan pengguna sudah memiliki akun dengan penyedia eksternal ini. Pengguna ini mungkin lebih cenderung mendaftar ke situs Anda jika mereka tidak perlu membuat dan mengingat sekumpulan kredensial baru.
Lihat juga ASP.NET aplikasi MVC 5 dengan SMS dan autentikasi Two-Factor email.
Tutorial ini juga menunjukkan cara menambahkan data profil untuk pengguna, dan cara menggunakan API Keanggotaan untuk menambahkan peran. Tutorial ini ditulis oleh Rick Anderson (Silakan ikuti saya di Twitter: @RickAndMSFT ).
Memulai
Mulailah dengan menginstal dan menjalankan Visual Studio Express 2013 untuk Web atau Visual Studio 2013. Instal Visual Studio 2013 Update 3 atau yang lebih tinggi.
Catatan
Anda harus menginstal Visual Studio 2013 Update 3 atau yang lebih tinggi untuk menggunakan Google OAuth 2 dan untuk men-debug secara lokal tanpa peringatan SSL.
Klik Proyek Baru dari halaman Mulai , atau Anda bisa menggunakan menu dan pilih File, lalu Proyek Baru.
Membuat aplikasi pertama Anda
Klik Proyek Baru, lalu pilih Visual C# di sebelah kiri, lalu Web lalu pilih ASP.NET Aplikasi Web. Beri nama proyek Anda "MvcAuth" lalu klik OK.
Dalam dialog Proyek ASP.NET Baru , klik MVC. Jika Autentikasi bukan Akun Pengguna Individual, klik tombol Ubah Autentikasi dan pilih Akun Pengguna Individual. Dengan memeriksa Host di cloud, aplikasi akan sangat mudah dihosting di Azure.
Jika Anda memilih Host di cloud, selesaikan dialog konfigurasi.
Menggunakan NuGet untuk memperbarui ke middleware OWIN terbaru
Gunakan manajer paket NuGet untuk memperbarui middleware OWIN. Pilih Updates di menu sebelah kiri. Anda dapat mengklik tombol Perbarui Semua atau Anda hanya dapat mencari paket OWIN (ditunjukkan pada gambar berikutnya):
Pada gambar di bawah ini, hanya paket OWIN yang ditampilkan:
Dari Package Manager Console (PMC), Anda dapat memasukkan Update-Package
perintah , yang akan memperbarui semua paket.
Tekan F5 atau Ctrl+F5 untuk menjalankan aplikasi. Pada gambar di bawah ini, nomor port adalah 1234. Saat menjalankan aplikasi, Anda akan melihat nomor port yang berbeda.
Bergantung pada ukuran jendela browser, Anda mungkin perlu mengklik ikon navigasi untuk melihat tautan Beranda, Tentang, Kontak, Daftar, dan Masuk .
Menyiapkan SSL di Proyek
Untuk terhubung ke penyedia autentikasi seperti Google dan Facebook, Anda harus menyiapkan IIS-Express untuk menggunakan SSL. Penting untuk terus menggunakan SSL setelah masuk dan tidak kembali ke HTTP, cookie login Anda sama rahasianya dengan nama pengguna dan kata sandi Anda, dan tanpa menggunakan SSL Anda mengirimkannya dalam teks yang jelas di seluruh kabel. Selain itu, Anda sudah meluangkan waktu untuk melakukan jabat tangan dan mengamankan saluran (yang merupakan sebagian besar dari apa yang membuat HTTPS lebih lambat dari HTTP) sebelum alur MVC dijalankan, jadi mengalihkan kembali ke HTTP setelah Anda masuk tidak akan membuat permintaan saat ini atau permintaan di masa mendatang jauh lebih cepat.
Di Penjelajah Solusi, klik proyek MvcAuth.
Tekan tombol F4 untuk menampilkan properti proyek. Atau, dari menu Tampilan Anda dapat memilih Jendela Properti.
Ubah SSL Diaktifkan ke True.
Salin URL SSL (yang akan menjadi
https://localhost:44300/
kecuali Anda telah membuat proyek SSL lainnya).Di Penjelajah Solusi, klik kanan proyek MvcAuth dan pilih Properti.
Pilih tab Web , lalu tempelkan URL SSL ke dalam kotak Url Proyek . Simpan file (Ctl+S). Anda akan memerlukan URL ini untuk mengonfigurasi aplikasi autentikasi Facebook dan Google.
Tambahkan atribut RequireHttps ke
Home
pengontrol untuk mengharuskan semua permintaan harus menggunakan HTTPS. Pendekatan yang lebih aman adalah menambahkan filter RequireHttps ke aplikasi. Lihat bagian "Lindungi Aplikasi dengan SSL dan Atribut Otorisasi" dalam tutorial saya Membuat aplikasi MVC ASP.NET dengan auth dan SQL DB dan menyebarkan ke Azure App Service. Sebagian pengontrol Rumah ditunjukkan di bawah ini.[RequireHttps] public class HomeController : Controller { public ActionResult Index() { return View(); }
Klik CTRL + F5 untuk menjalankan aplikasi. Jika Anda telah menginstal sertifikat di masa lalu, Anda dapat melewati sisa bagian ini dan melompat ke Membuat aplikasi Google untuk OAuth 2 dan menghubungkan aplikasi ke proyek, jika tidak, ikuti instruksi untuk mempercayai sertifikat yang ditandatangani sendiri yang telah dibuat oleh IIS Express.
Baca dialog Peringatan Keamanan lalu klik Ya jika Anda ingin menginstal sertifikat yang mewakili localhost.
IE memperlihatkan halaman Beranda dan tidak ada peringatan SSL.
Google Chrome juga menerima sertifikat dan akan menampilkan konten HTTPS tanpa peringatan. Firefox menggunakan penyimpanan sertifikatnya sendiri, sehingga akan menampilkan peringatan. Untuk aplikasi kami, Anda dapat dengan aman mengklik Saya Memahami Risiko.
Membuat aplikasi Google untuk OAuth 2 dan menghubungkan aplikasi ke proyek
Peringatan
Untuk petunjuk Google OAuth saat ini, lihat Mengonfigurasi autentikasi Google di ASP.NET Core.
Buka Konsol Pengembang Google.
Jika Anda belum membuat proyek sebelumnya, pilih Kredensial di tab kiri, lalu pilih Buat.
Di tab sebelah kiri, klik Kredensial.
Klik Buat kredensial lalu ID klien OAuth.
- Dalam dialog Buat ID Klien , pertahankan aplikasi Web default untuk jenis aplikasi.
- Atur asal JavaScript resmi ke URL SSL yang Anda gunakan di atas (
https://localhost:44300/
kecuali Anda telah membuat proyek SSL lainnya) - Atur URI pengalihan resmi ke:
https://localhost:44300/signin-google
Klik item menu layar Persetujuan OAuth, lalu atur alamat email dan nama produk Anda. Ketika Anda telah menyelesaikan formulir, klik Simpan.
Klik item menu Pustaka, telusuri Google+ API, klik lalu tekan Aktifkan.
Gambar di bawah ini menunjukkan API yang diaktifkan.
Dari Google API API Manager, kunjungi tab Kredensial untuk mendapatkan ID Klien. Unduh untuk menyimpan file JSON dengan rahasia aplikasi. Salin dan tempel ClientId dan ClientSecret ke dalam metode yang
UseGoogleAuthentication
ditemukan dalam file Startup.Auth.cs di folder App_Start . Nilai ClientId dan ClientSecret yang ditunjukkan di bawah ini adalah sampel dan tidak berfungsi.public void ConfigureAuth(IAppBuilder app) { // Configure the db context and user manager to use a single instance per request app.CreatePerOwinContext(ApplicationDbContext.Create); app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); // Enable the application to use a cookie to store information for the signed in user // and to use a cookie to temporarily store information about a user logging in with a third party login provider // Configure the sign in cookie app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Account/Login"), Provider = new CookieAuthenticationProvider { OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>( validateInterval: TimeSpan.FromMinutes(30), regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) } }); app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); // Uncomment the following lines to enable logging in with third party login providers //app.UseMicrosoftAccountAuthentication( // clientId: "", // clientSecret: ""); //app.UseTwitterAuthentication( // consumerKey: "", // consumerSecret: ""); //app.UseFacebookAuthentication( // appId: "", // appSecret: ""); app.UseGoogleAuthentication( clientId: "000-000.apps.googleusercontent.com", clientSecret: "00000000000"); }
Peringatan
Keamanan - Jangan pernah menyimpan data sensitif dalam kode sumber Anda. Akun dan kredensial ditambahkan ke kode di atas untuk menjaga sampel tetap sederhana. Lihat Praktik terbaik untuk menyebarkan kata sandi dan data sensitif lainnya ke ASP.NET dan Azure App Service.
Tekan CTRL+F5 untuk membangun dan menjalankan aplikasi. Klik tautan Masuk .
Di bawah Gunakan layanan lain untuk masuk, klik Google.
Catatan
Jika Anda melewatkan salah satu langkah di atas, Anda akan mendapatkan kesalahan HTTP 401. Centang ulang langkah-langkah Anda di atas. Jika Anda melewatkan pengaturan yang diperlukan (misalnya nama produk), tambahkan item yang hilang dan simpan; dibutuhkan beberapa menit agar autentikasi berfungsi.
Anda akan diarahkan ke situs Google tempat Anda akan memasukkan kredensial Anda.
Setelah memasukkan kredensial, Anda akan diminta untuk memberikan izin ke aplikasi web yang baru saja Anda buat:
Klik Terima. Anda sekarang akan diarahkan kembali ke halaman Daftar aplikasi MvcAuth tempat Anda dapat mendaftarkan akun Google Anda. Anda memiliki opsi untuk mengubah nama pendaftaran email lokal yang digunakan untuk akun Gmail Anda, tetapi umumnya Anda ingin menyimpan alias email default (yaitu, yang Anda gunakan untuk autentikasi). Klik Daftar.
Membuat aplikasi di Facebook dan menghubungkan aplikasi ke proyek
Peringatan
Untuk petunjuk autentikasi Facebook OAuth2 saat ini, lihat Mengonfigurasi autentikasi Facebook
Memeriksa Data Keanggotaan Menggunakan Server Explorer
Di menu Tampilan , klik Penjelajah Server.
Perluas DefaultConnection (MvcAuth), perluas Tabel, klik kanan AspNetUsers dan klik Perlihatkan Data Tabel.
Menambahkan Data Profil ke Kelas Pengguna
Di bagian ini Anda akan menambahkan tanggal lahir dan kota asal ke data pengguna selama pendaftaran, seperti yang ditunjukkan pada gambar berikut.
Buka file Models\IdentityModels.cs dan tambahkan tanggal lahir dan properti kota asal:
public class ApplicationUser : IdentityUser
{
public string HomeTown { get; set; }
public System.DateTime? BirthDate { get; set; }
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
}
Buka file Models\AccountViewModels.cs dan tanggal lahir yang ditetapkan dan properti kota asal di ExternalLoginConfirmationViewModel
.
public class ExternalLoginConfirmationViewModel
{
[Required]
[EmailAddress]
[Display(Name = "Email")]
public string Email { get; set; }
public string HomeTown { get; set; }
public System.DateTime? BirthDate { get; set; }
}
Buka file Controllers\AccountController.cs dan tambahkan kode untuk tanggal lahir dan kota asal dalam metode tindakan seperti yang ExternalLoginConfirmation
ditunjukkan:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl)
{
if (User.Identity.IsAuthenticated)
{
return RedirectToAction("Manage");
}
if (ModelState.IsValid)
{
// Get the information about the user from the external login provider
var info = await AuthenticationManager.GetExternalLoginInfoAsync();
if (info == null)
{
return View("ExternalLoginFailure");
}
var user = new ApplicationUser()
{
UserName = model.Email, Email = model.Email,
BirthDate = model.BirthDate,
HomeTown = model.HomeTown
};
IdentityResult result = await UserManager.CreateAsync(user);
if (result.Succeeded)
{
result = await UserManager.AddLoginAsync(user.Id, info.Login);
if (result.Succeeded)
{
await SignInAsync(user, isPersistent: false);
// For more information on how to enable account confirmation and password reset please visit https://go.microsoft.com/fwlink/?LinkID=320771
// Send an email with this link
// string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
// var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
// SendEmail(user.Email, callbackUrl, "Confirm your account", "Please confirm your account by clicking this link");
return RedirectToLocal(returnUrl);
}
}
AddErrors(result);
}
ViewBag.ReturnUrl = returnUrl;
return View(model);
}
Tambahkan tanggal lahir dan kota asal ke file Views\Account\ExternalLoginConfirmation.cshtml :
@model MvcAuth.Models.ExternalLoginConfirmationViewModel
@{
ViewBag.Title = "Register";
}
<h2>@ViewBag.Title.</h2>
<h3>Associate your @ViewBag.LoginProvider account.</h3>
@using (Html.BeginForm("ExternalLoginConfirmation", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>Association Form</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<p class="text-info">
You've successfully authenticated with <strong>@ViewBag.LoginProvider</strong>.
Please enter a user name for this site below and click the Register button to finish
logging in.
</p>
<div class="form-group">
@Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.Email, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.HomeTown, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.HomeTown, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.HomeTown)
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.BirthDate, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.BirthDate, new { @class = "form-control" })
@Html.ValidationMessageFor(m => m.BirthDate)
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" class="btn btn-default" value="Register" />
</div>
</div>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
Hapus database keanggotaan sehingga Anda dapat kembali mendaftarkan akun Facebook dengan aplikasi Anda dan memverifikasi bahwa Anda dapat menambahkan tanggal lahir baru dan informasi profil kota asal.
Dari Penjelajah Solusi, klik ikon Perlihatkan Semua File, lalu klik kanan Add_Data\aspnet-MvcAuth-dateStamp.mdf<> dan klik Hapus.
Dari menu Alat , klik NuGet Package Manger, lalu klik Package Manager Console (PMC). Masukkan perintah berikut di PMC.
- Enable-Migrations
- Add-Migration Init
- Update-Database
Jalankan aplikasi dan gunakan FaceBook dan Google untuk masuk dan mendaftarkan beberapa pengguna.
Memeriksa Data Keanggotaan
Di menu Tampilan , klik Penjelajah Server.
Klik kanan AspNetUsers dan klik Perlihatkan Data Tabel.
Bidang HomeTown
dan BirthDate
ditunjukkan di bawah ini.
Keluar dari Aplikasi Anda dan Masuk Dengan Akun Lain
Jika Anda masuk ke aplikasi Anda dengan Facebook, lalu keluar dan mencoba masuk lagi dengan akun Facebook yang berbeda (menggunakan browser yang sama), Anda akan segera masuk ke akun Facebook sebelumnya yang Anda gunakan. Untuk menggunakan akun lain, Anda perlu menavigasi ke Facebook dan keluar di Facebook. Aturan yang sama berlaku untuk penyedia autentikasi pihak ke-3 lainnya. Atau, Anda dapat masuk dengan akun lain dengan menggunakan browser yang berbeda.
Langkah berikutnya
Ikuti tutorial saya Membuat aplikasi MVC ASP.NET dengan auth dan SQL DB dan sebarkan ke Azure App Service, yang melanjutkan tutorial ini dan menunjukkan hal-hal berikut:
- Cara menyebarkan aplikasi Anda ke Azure.
- Cara mengamankan aplikasi Anda dengan peran.
- Cara mengamankan aplikasi Anda dengan filter RequireHttps dan Authorize .
- Cara menggunakan API keanggotaan untuk menambahkan pengguna dan peran.
Untuk penjelasan yang baik tentang cara kerja Layanan Autentikasi Eksternal ASP.NET, lihat Layanan Autentikasi Eksternal Robert McMurray. Artikel Robert juga menjelaskan secara rinci dalam mengaktifkan autentikasi Microsoft dan Twitter. Tutorial EF/MVC Tom Dykstra yang sangat baik menunjukkan cara bekerja dengan Kerangka Kerja Entitas.