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.
ApplicationUser
kelas (khusus aplikasi) danAspNetUsers
tabel secara paralel dan mereka akan memberikan bidang baru. Sekali lagi: Jangan tekan database secara langsung! :)Kesalahan saya, saya seharusnya tidak menggunakan metode di dalam permintaan LINQ.
Kode yang benar:
sumber
UserManager
metode dan tidak memukul database secara langsung?Itu di komentar dari jawaban tetapi tidak ada yang memposting ini sebagai solusi yang sebenarnya.
Anda hanya perlu menambahkan pernyataan menggunakan di atas:
sumber
using
. Melihat 15k orang telah mengunjungi pertanyaan yang saya pikir itu adalah jawaban yang membantu :).GetUserId()
merupakan metode ekstensiKode Ellbar berfungsi! Anda hanya perlu menambahkan menggunakan.
1 -
using Microsoft.AspNet.Identity;
Dan ... kode Ellbar:
2 -
string currentUserId = User.Identity.GetUserId(); ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId);
Dengan kode ini (dalam
currentUser
), Anda mengerjakan data umum dari pengguna yang terhubung, jika Anda ingin data tambahan ... lihat tautan inisumber
ApplicationUser
objekPada ASP.NET Identity 3.0.0, Ini telah direactored menjadi
sumber
sumber
Untuk MVC 5 lihat saja metode EnableTwoFactorAuthentication dari ManageController di scaffold template WebApplication, sedang dilakukan di sana:
Jawabannya ada di sana seperti yang disarankan oleh Microsoft sendiri:
Ini akan memiliki semua properti tambahan yang Anda tetapkan di kelas ApplicationUser.
sumber
Saat ini template proyek asp.mvc membuat pengontrol akun yang membuat pengelola akun ini dengan cara ini:
Berikut ini berfungsi untuk saya:
sumber
Saya berhasil mendapatkan Pengguna Aplikasi Dengan Mengikuti Sepotong Kode
sumber
Jika seseorang bekerja dengan
Identity
penggunaweb forms
, saya membuatnya bekerja dengan melakukannya:sumber