Cara mendapatkan pengguna saat ini di ASP.NET MVC


268

Dalam model formulir, saya biasa mendapatkan pengguna login saat ini dengan:

Page.CurrentUser

Bagaimana cara mendapatkan pengguna saat ini di dalam kelas kontroler di ASP.NET MVC?

Jawaban:


266

Jika Anda perlu mendapatkan pengguna dari dalam pengontrol, gunakan Userproperti Pengontrol. Jika Anda memerlukannya dari tampilan, saya akan mengisi apa yang Anda butuhkan secara khusus di ViewData, atau Anda bisa memanggil Pengguna karena saya pikir itu adalah milik ViewPage.


2
"atau Anda bisa memanggil Pengguna karena saya pikir itu adalah properti ViewPage" - Jadi maksud Anda menggunakan Page.user saat Anda berada dalam tampilan?
mawaldne

17
Ya, Anda dapat menggunakannya seperti, "Hai, @ User.Identity.Name!" di cshtml.
Sean

198

Saya menemukan bahwa itu Userberfungsi, yaitu, User.Identity.Nameatau User.IsInRole("Administrator").


19
Sebagai tambahan, jika Anda bekerja di kelas di luar formulir, Anda harus Imports System.Webdan lebih lanjut memenuhi syarat dengan HttpContext.Current.User.Identity.Name, atau langsung memenuhi syarat menggunakan sintaks lengkap:System.Web.HttpContext.Current.User.Identity.Name
Paul

Bekerja di dalam Kontroler dan jika menggunakan Model View baik mewarisi dari Kontroler atau mengikuti saran Paul.
bermanfaatBee

60

Coba HttpContext.Current.User.

Properti Berbagi Umum Saat Ini () Sebagai System.Web.HttpContext
Anggota System.Web.HttpContext

Ringkasan:
Mendapat atau menetapkan objek System.Web.HttpContext untuk permintaan HTTP saat ini.

Nilai Pengembalian:
System.Web.HttpContext untuk permintaan HTTP saat ini


2
Rupanya HttpContext tidak memiliki properti bernama "Lancar".
Serhat Ozgel

20
Saya percaya kalian berdua berbicara tentang dua hal yang berbeda. System.Web.HttpContext dan properti statis: System.Web.Mvc.Controller.HttpContext (Yang tidak memiliki properti "Current".
Jeff Sheldon

1
Itu bekerja pada lingkungan non-MVC, hanya apa yang saya butuhkan. Terima kasih! :)
Wagner da Silva

38

Anda bisa mendapatkan nama pengguna di ASP.NET MVC4 seperti ini:

System.Web.HttpContext.Current.User.Identity.Name

4
Jika Anda mendapatkan kesalahan ini 'System.Web.HttpContextBase' does not contain a definition for 'Current' and no extension method 'Current' accepting a first argument of type 'System.Web.HttpContextBase' could be found, saya sarankan melakukan panggilan absolut seperti ini System.Web.HttpContext.Current.User.Identity.Name,.
Simple Sandman

21

Saya menyadari ini benar-benar tua, tapi saya baru memulai dengan ASP.NET MVC, jadi saya pikir saya akan memasukkan dua sen saya di:

  • Request.IsAuthenticated memberi tahu Anda jika pengguna diautentikasi.
  • Page.User.Identity memberi Anda identitas pengguna yang masuk.

16

Saya menggunakan:

Membership.GetUser().UserName

Saya tidak yakin ini akan bekerja di ASP.NET MVC, tetapi patut dicoba :)


Dari mana kelas Keanggotaan ini berasal? IntelliSense tidak mengenalinya secara default.
Serhat Ozgel

System.Web.Nama keamanan. Saya tidak yakin ini berguna dalam MVC tetapi saya menggunakannya dengan kontrol masuk untuk Formulir Web.
Sean

1
Ini berguna dalam aplikasi ASP.NET apa pun yang menggunakan penyedia Keanggotaan.
jamiebarrow

2
Ini sebenarnya akan membuat permintaan basis data. HttpContext.Current.User tidak.
Mike Cole

11

mendapatkan nama pengguna login: System.Web.HttpContext.Current.User.Identity.Name


9

Untuk referensi ID pengguna yang dibuat menggunakan otentikasi sederhana yang dibangun ke dalam ASP.NET MVC 4 di controller untuk keperluan penyaringan (yang berguna jika Anda menggunakan database pertama dan Kerangka Entity 5 untuk menghasilkan binding pertama-kode dan tabel Anda terstruktur sehingga bahwa kunci asing ke ID pengguna digunakan), Anda dapat menggunakan

WebSecurity.CurrentUserId

setelah Anda menambahkan pernyataan menggunakan

using System.Web.Security;

4
Sayangnya ini sepertinya tidak berfungsi lagi di MVC 5. Tidak yakin mengapa = /
Jed Grant

2
Hanya System.Security.Principal.WindowsIdentity.GetCurrent().Namebekerja di MVC 5. Namun itu menarik nama domain dengan nama pengguna. yaitu domain \ username
shaz

8

Kita dapat menggunakan kode berikut untuk mendapatkan Pengguna yang login saat ini di ASP.Net MVC:

var user= System.Web.HttpContext.Current.User.Identity.GetUserName();

Juga

var userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; //will give 'Domain//UserName'

Environment.UserName - Will Display format : 'Username'

7

UserName dengan:

User.Identity.Name

Tetapi jika Anda hanya perlu mendapatkan ID, Anda dapat menggunakan:

using Microsoft.AspNet.Identity;

Jadi, Anda bisa mendapatkan ID Pengguna secara langsung:

User.Identity.GetUserId();

Metode ini mengembalikan System.Guid
Gilberto B. Terra Jr

User.Identity.Name adalah turunan dari System.Security.Principal.IPrincipal yang tidak memiliki properti id ... Apakah Pengguna ini berbeda dari User.Identity.GetUserId objek Pengguna
Samra


5

Menggunakan System.Security.Principal.WindowsIdentity.GetCurrent().Name .

Ini akan mendapatkan pengguna Windows login saat ini.


1
Meskipun kode ini dapat menjawab pertanyaan, akan lebih baik untuk memasukkan beberapa konteks, menjelaskan cara kerjanya, dan menjelaskan kapan menggunakannya. Jawaban kode saja tidak berguna dalam jangka panjang.
ryanyuyu

System.Security.Principal.WindowsIdentity.GetCurrent (). Nama mengembalikan pengguna saat ini yang masuk ke Windows, OP meminta pengguna yang saat ini masuk ke situs web.
GrandMasterFlush

4

Untuk apa nilainya, dalam ASP.NET MVC 3 Anda bisa menggunakan Pengguna yang mengembalikan pengguna untuk permintaan saat ini.


4

Jika Anda berada di dalam halaman login Anda, dalam acara LoginUser_LoggedIn misalnya, Current.User.Identity.Name akan mengembalikan nilai kosong, jadi Anda harus menggunakan propertiLoginControlName.UserName Anda.

MembershipUser u = Membership.GetUser(LoginUser.UserName);


3
IPrincipal currentUser = HttpContext.Current.User;
bool writeEnable = currentUser.IsInRole("Administrator") ||
        ...
                   currentUser.IsInRole("Operator");

2
var ticket = FormsAuthentication.Decrypt(
                    HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName].Value);

if (ticket.Expired)
{
    throw new InvalidOperationException("Ticket expired.");
}

IPrincipal user =  (System.Security.Principal.IPrincipal) new RolePrincipal(new FormsIdentity(ticket));

2

Jika Anda bekerja di Active Directory pada intranet, berikut adalah beberapa tips:

(Windows Server 2012)

Menjalankan apa pun yang berbicara dengan AD di server web membutuhkan banyak perubahan dan kesabaran. Karena ketika berjalan di server web vs IIS / IIS Express lokal itu berjalan di identitas AppPool, Anda harus mengaturnya untuk meniru siapa pun yang mengunjungi situs.

Cara mendapatkan pengguna login saat ini di direktori aktif ketika aplikasi ASP.NET MVC Anda berjalan di server web di dalam jaringan:

// Find currently logged in user
UserPrincipal adUser = null;
using (HostingEnvironment.Impersonate())
{
    var userContext = System.Web.HttpContext.Current.User.Identity;
    PrincipalContext ctx = new PrincipalContext(ContextType.Domain, ConfigurationManager.AppSettings["AllowedDomain"], null,
                                                ContextOptions.Negotiate | ContextOptions.SecureSocketLayer);
    adUser = UserPrincipal.FindByIdentity(ctx, userContext.Name);
}
//Then work with 'adUser' from here...

Anda harus menutup semua panggilan yang berkaitan dengan 'konteks direktori aktif' di bawah ini sehingga bertindak sebagai lingkungan hosting untuk mendapatkan informasi AD:

using (HostingEnvironment.Impersonate()){ ... }

Anda juga harus impersonatemengeset true di web.config Anda:

<system.web>
    <identity impersonate="true" />

Anda harus mengaktifkan otentikasi Windows di web.config:

<authentication mode="Windows" />

Saya tidak percaya, karena ini secara eksplisit menggunakan kredensial pengguna Active Directory Anda. Mengapa Anda memiliki 'Formulir' jika Anda ingin agar pengguna Anda diautentikasi melalui AD?
Beau D'Amore

Di organisasi kami, ada lokasi di mana kami memiliki beberapa stasiun kerja yang digunakan bersama oleh beberapa personel "lapangan". Karena itu, kami diharuskan menambahkan halaman login ke aplikasi web intranet kami.
Patee Gutee

sebagai solusinya: Anda dapat menjalankan dua salinan aplikasi ini, satu dalam mode 'Formulir' dengan tabel identitasnya sendiri atau Anda dapat mencampur keduanya dalam satu aplikasi, tetapi lebih rumit. Google cepat mengungkapkan ini: stackoverflow.com/questions/2250921/…
Beau D'Amore

<identity impersonate = "true" /> mungkin perlu diubah jika bercampur
Beau D'Amore

2

Di Asp.net Mvc Identity 2, Anda bisa mendapatkan nama pengguna saat ini dengan:

var username = System.Web.HttpContext.Current.User.Identity.Name;

1

Di Manajer IIS, di bawah Otentikasi, nonaktifkan: 1) Otentikasi Anonim 2) Otentikasi Formulir

Kemudian tambahkan berikut ini ke controller Anda, untuk menangani pengujian versus penyebaran server:

string sUserName = null;
string url = Request.Url.ToString();

if (url.Contains("localhost"))
  sUserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
else
  sUserName = User.Identity.Name;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.