Bagaimana cara mendapatkan pengguna saat ini, dan bagaimana menggunakan kelas Pengguna di MVC5?

159
  • Bagaimana saya bisa mendapatkan id dari pengguna yang saat ini login di MVC 5 ? Saya mencoba saran StackOverflow, tetapi tampaknya bukan untuk MVC 5.
  • Juga, apa praktik terbaik MVC 5 dalam menetapkan barang kepada pengguna? (misalnya Userseharusnya Items. Haruskah saya menyimpan Pengguna Iddi Item? Dapatkah saya memperluas Userkelas dengan List<Item>properti navigasi?

Saya menggunakan "Akun Pengguna Perorangan" dari template MVC.

Mencoba ini:

'Keanggotaan.GetUser ()' adalah nol.

Adam Szabo
sumber
Menambahkan referensi dari apa yang saya coba. Yang terakhir OK di MVC4 tetapi tidak di MVC5. Saya juga memerlukan praktik terbaik "menggunakan Pengguna" :)
Adam Szabo
Ketika Anda mengatakan Anda menggunakan MVC 5, apa yang Anda gunakan untuk keanggotaan? KEAMANAN?
Aron
"Akun Pengguna Perorangan" dari templat MVC.
Adam Szabo
3
HttpContext.Current.User.Identity.Nameadalah nama pengguna yang saat ini dicatat
Wiktor Zychla
1
Bagaimana cara mendapatkan ID ? Saya ingin menetapkan pengguna saat ini ke Itemdia menciptakan, tetapi tidak berdasarkan pada nama pengguna (yang mungkin berubah). Itu tidak bekerja dengan cara `HttpContext.Current 'System.Web.HttpContextBase' tidak mengandung definisi untuk 'Current' dan tidak ada metode ekstensi 'Current' menerima argumen pertama dari tipe 'System.Web.HttpContextBase' dapat ditemukan ( apakah Anda melewatkan arahan menggunakan atau referensi rakitan?) `. Apakah Anda yakin solusi Anda untuk MVC 5?
Adam Szabo

Jawaban:

313

Jika Anda mengode dalam ASP.NET MVC Controller, gunakan

using Microsoft.AspNet.Identity;

...

User.Identity.GetUserId();

Layak disebutkan itu User.Identity.IsAuthenticateddan User.Identity.Nameakan bekerja tanpa menambahkan usingpernyataan yang disebutkan di atas . Tetapi GetUserId()tidak akan hadir tanpa itu.

Jika Anda berada di kelas selain Pengendali, gunakan

HttpContext.Current.User.Identity.GetUserId();

Dalam template default MVC 5, ID pengguna adalah GUID yang disimpan sebagai string.

Belum ada praktik terbaik, tetapi temukan beberapa info berharga tentang cara memperpanjang profil pengguna:

Adam Szabo
sumber
9
Otentikasi dan otorisasi pengguna telah berubah untuk ASP.NET MVC 5. Sekarang ini adalah otentikasi berbasis klaim dengan antarmuka dan repositori generik yang dapat Anda gunakan dengan EF atau penyedia lain (implementasi EF datang sebagai standar). Karena GetUserIdmerupakan metode ekstensi yang disimpan di bagian bawah Ass_Start\IdentityConfig.cs, di mana pun Anda perlu menggunakannya, jika di ruang nama yang berbeda, Anda harus mengatur using Microsoft.AspNet.Identityagar ekstensi tersebut menjadi terlihat.
Anderson Matos
1
survey.UserId = Guid.Parse (User.Identity.GetUserId ());
NicoJuicy
Jika saya menambahkan referensi menggunakan Pengguna masih bergaris bawah merah? Mengapa ini terjadi?
Zapnologica
@Zapnologica: cobalah untuk membangun kembali proyek, mungkin VS IntelliSense agak lambat.
Adam Szabo
5
CATATAN Pengguna hanya tersedia di Pengontrol msdn.microsoft.com/en-us/library/… (@Zapnologica apakah Anda menggunakannya di luar pengontrol? Coba HttpContext.Current.User.Identity.GetUserId ();)
Adween
28

Coba sesuatu seperti:

var store = new UserStore<ApplicationUser>(new ApplicationDbContext());
var userManager = new UserManager<ApplicationUser>(store);
ApplicationUser user = userManager.FindByNameAsync(User.Identity.Name).Result;

Bekerja dengan RTM.

Rok Bermež
sumber
11
Itu membebankan perjalanan basis data yang tidak perlu.
Arash
3
@Arash, bagaimana aplikasi seharusnya mendapatkan objek pengguna tanpa menghubungi database?
fabspro
2
@Arash, sudahlah, aku mengerti maksudmu. ID dapat diambil dengan User.Identity.GetUserId (); tanpa perjalanan basis data.
fabspro
Ingat dengan mvc5 (keanggotaan 2): User.Identity.GetUserId () berbeda dengan id di tabel [AspNetUsers]. Jadi Jakub Arnold dan Rok adalah cara yang benar
Gray Wolf
Saya agak bingung dengan jawabannya. Saya mendapatkan tipe UserStore sepertinya tidak ada dalam konteks controller saya. Ada ide?
Jhourlad Estrella
19

Jika Anda ingin objek ApplicationUser dalam satu baris kode (jika Anda memiliki ASP.NET Identity terinstal), cobalah:

ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());

Anda akan membutuhkan pernyataan penggunaan berikut:

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
firecape
sumber
Objek tidak ditemukan untuk <ApplicationUserManager>
Fandango68
7

Mendapatkan Id sangat mudah dan Anda telah menyelesaikannya.

Namun pertanyaan kedua Anda sedikit lebih terlibat.

Jadi, ini adalah semua hal pra-rilis sekarang, tetapi masalah umum yang Anda hadapi adalah ketika Anda memperluas pengguna dengan properti baru (atau koleksi Item di pertanyaan Anda).

Di luar kotak Anda akan mendapatkan file yang disebut di IdentityModelbawah folder Model (pada saat penulisan). Di sana Anda memiliki beberapa kelas; ApplicationUserdan ApplicationDbContext. Untuk menambahkan koleksi ItemsAnda, Anda ingin memodifikasi ApplicationUserkelas, sama seperti yang Anda lakukan jika ini adalah kelas normal yang Anda gunakan dengan Entity Framework. Bahkan, jika Anda melihat sekilas di bawah tenda Anda akan menemukan bahwa semua kelas terkait identitas (Pengguna, Peran dll ...) hanyalah POCO sekarang dengan anotasi data yang sesuai sehingga mereka bermain bagus dengan EF6.

Selanjutnya, Anda harus membuat beberapa perubahan pada AccountControllerkonstruktor sehingga ia tahu untuk menggunakan DbContext Anda.

public AccountController()
{
    IdentityManager = new AuthenticationIdentityManager(
    new IdentityStore(new ApplicationDbContext()));
}

Sekarang mendapatkan seluruh objek pengguna untuk pengguna login Anda sedikit esoteris jujur.

    var userWithItems = (ApplicationUser)await IdentityManager.Store.Users
    .FindAsync(User.Identity.GetUserId(), CancellationToken.None);

Baris itu akan menyelesaikan pekerjaan dan Anda akan dapat mengakses userWithItems.Itemsseperti yang Anda inginkan.

HTH

EightyOne Unite
sumber
Saya tidak mengira ada sesuatu seperti dokumen pra-rilis untuk semua ini?
Derek Tomes
@Derek Tomes - Bukannya saya pernah menemukan. Saya rasa kita harus menunggu hingga 13 November untuk dokumen nyata. Tidak terlalu bagus untuk jujur, bahkan ada permintaan untuk panduan yang lebih baik di uservoice - aspnet.uservoice.com/forums/41199-general-asp-net/suggestions/…
EightyOne Unite
ok tapi bagaimana cara saya mendapatkan contoh tipe AccountController?
sarang
0

Saya merasakan sakit Anda, saya mencoba melakukan hal yang sama. Dalam kasus saya, saya hanya ingin menghapus pengguna.

Saya telah membuat kelas pengendali basis yang diwarisi oleh semua pengontrol saya. Di dalamnya saya menimpa OnAuthenticationdan mengaturfilterContext.HttpContext.User to null

Itu yang terbaik yang saya berhasil sejauh ini ...

public abstract class ApplicationController : Controller   
{
    ...
    protected override void OnAuthentication(AuthenticationContext filterContext)
    {
        base.OnAuthentication(filterContext); 

        if ( ... )
        {
            // You may find that modifying the 
            // filterContext.HttpContext.User 
            // here works as desired. 
            // In my case I just set it to null
            filterContext.HttpContext.User = null;
        }
    }
    ...
}
Derek Tomes
sumber
0
        string userName="";
        string userId = "";
        int uid = 0;
        if (HttpContext.Current != null && HttpContext.Current.User != null
                  && HttpContext.Current.User.Identity.Name != null)
        {
            userName = HttpContext.Current.User.Identity.Name;              
        }
        using (DevEntities context = new DevEntities())
        {

              uid = context.Users.Where(x => x.UserName == userName).Select(x=>x.Id).FirstOrDefault();
            return uid;
        }

        return uid;
Hari Lakkakula
sumber
Tolong jangan hanya mengirim kode terutama tanpa tanpa komentar. Jika Anda menjelaskan kode Anda, itu akan lebih membantu.
Ali Kanat
0

jika ada orang lain yang mengalami situasi ini: saya membuat verifikasi email untuk masuk ke aplikasi saya sehingga pengguna saya belum masuk, namun saya menggunakan di bawah ini untuk memeriksa email yang dimasukkan pada login yang merupakan variasi dari solusi @firecape

 ApplicationUser user = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindByEmail(Email.Text);

Anda juga membutuhkan yang berikut ini:

using Microsoft.AspNet.Identity;

dan

using Microsoft.AspNet.Identity.Owin;
Duan Walker
sumber
0

Dalam. Net MVC5 inti 2.2, saya menggunakan HttpContext.User.Identity.Name. Ini berhasil untuk saya.

Bhupinder Yadav
sumber
0

Ini adalah bagaimana saya mendapat ID AspNetUser dan menampilkannya di halaman rumah saya

Saya menempatkan kode berikut dalam metode HomeController Index () saya

ViewBag.userId = User.Identity.GetUserId();

Di halaman tampilan panggil saja

ViewBag.userId 

Jalankan proyek dan Anda akan dapat melihat userId Anda

kelvin nyadzayo
sumber