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?

Serhat Ozgel
sumber

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.

Haacked
sumber
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").

Peter Mortensen
sumber
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

merpati
sumber
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
radbyx
sumber
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.
jrb
sumber
16

Saya menggunakan:

Membership.GetUser().UserName

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

Sean
sumber
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

tifoz
sumber
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;
MattC
sumber
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'
Raj Baral
sumber
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();
Gilberto B. Terra Jr.
sumber
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
6

Halaman ini bisa menjadi apa yang Anda cari:
Menggunakan Page.User.Identity.Name di MVC3

Anda hanya perlu User.Identity.Name.

heriawan
sumber
Ini hanya berfungsi di dalam Controller; atau jika ViewModel Anda mewarisi dari Controller
usefulBee
5

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

Ini akan mendapatkan pengguna Windows login saat ini.

Clay Smith
sumber
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.

Pieter
sumber
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);
cinta hidup
sumber
4

Anda dapat menggunakan kode berikut:

Request.LogonUserIdentity.Name;
Rajeev Jayaswal
sumber
Ini memberi Anda nama pengguna AppPool yang menjalankan aplikasi.
Jason Geiger
3
IPrincipal currentUser = HttpContext.Current.User;
bool writeEnable = currentUser.IsInRole("Administrator") ||
        ...
                   currentUser.IsInRole("Operator");
Gediminas Bukauskas
sumber
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));
Ognyan Dimitrov
sumber
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" />
Beau D'Amore
sumber
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;
Fereydoon Barikzehy
sumber
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;
Daniel King
sumber