Anda tidak perlu menanyakan database secara langsung untuk ApplicationUser saat ini.
Itu memperkenalkan ketergantungan baru untuk memiliki konteks tambahan sebagai permulaan, tetapi ke depan tabel database pengguna berubah (3 kali dalam 2 tahun terakhir) tetapi API konsisten. Misalnya users
tabel sekarang disebut AspNetUsers
dalam Kerangka Identitas, dan nama-nama beberapa bidang kunci utama terus berubah, sehingga kode dalam beberapa jawaban tidak lagi berfungsi sebagaimana adanya .
Masalah lain adalah bahwa akses OWIN yang mendasari ke database akan menggunakan konteks yang terpisah, sehingga perubahan dari akses SQL yang terpisah dapat menghasilkan hasil yang tidak valid (misalnya tidak melihat perubahan yang dibuat ke database). Sekali lagi solusinya adalah bekerja dengan API yang disediakan dan tidak mencoba untuk mengatasinya .
Cara yang benar untuk mengakses objek pengguna saat ini dalam identitas ASP.Net (seperti pada tanggal ini) adalah:
var user = UserManager.FindById(User.Identity.GetUserId());
atau, jika Anda memiliki tindakan async, sesuatu seperti:
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
FindById
mengharuskan Anda memiliki pernyataan menggunakan berikut ini agar metode non-async UserManager
tersedia (mereka adalah metode ekstensi untuk UserManager, jadi jika Anda tidak menyertakan ini Anda hanya akan melihat FindByIdAsync
):
using Microsoft.AspNet.Identity;
Jika Anda tidak berada di pengontrol sama sekali (misalnya Anda menggunakan injeksi IOC), maka id pengguna diambil dari:
System.Web.HttpContext.Current.User.Identity.GetUserId();
Jika Anda tidak berada di pengontrol Akun standar, Anda harus menambahkan yang berikut ini (sebagai contoh) ke pengontrol Anda:
1. Tambahkan dua properti ini:
/// <summary>
/// Application DB context
/// </summary>
protected ApplicationDbContext ApplicationDbContext { get; set; }
/// <summary>
/// User manager - attached to application DB context
/// </summary>
protected UserManager<ApplicationUser> UserManager { get; set; }
2. Tambahkan ini dalam konstruktor Pengendali:
this.ApplicationDbContext = new ApplicationDbContext();
this.UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.ApplicationDbContext));
Pembaruan Maret 2015
Catatan: Pembaruan terbaru untuk Kerangka kerja identitas mengubah salah satu kelas dasar yang digunakan untuk otentikasi. Anda sekarang dapat mengaksesnya dari Konteks Owin dari HttpContent saat ini.
ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());
Tambahan:
Saat menggunakan EF dan Identity Framework dengan Azure, melalui koneksi basis data jarak jauh (mis. Pengujian host lokal ke database Azure), Anda dapat secara acak menekan "kesalahan: 19 - Koneksi fisik tidak dapat digunakan". Karena penyebabnya terkubur di dalam Kerangka Identitas, tempat Anda tidak dapat menambahkan percobaan ulang (atau yang tampaknya hilang .Include(x->someTable)
), Anda perlu menerapkan kebiasaan SqlAzureExecutionStrategy
di proyek Anda.