ASP.NET MVC geçerli kullanıcı almak için nasıl


268

Bir form modelinde, şu anda oturum açmış olan kullanıcıyı şu şekilde alırdım:

Page.CurrentUser

Geçerli kullanıcıyı ASP.NET MVC'de bir denetleyici sınıfı içinde nasıl edinebilirim?

Yanıtlar:


266

Kullanıcıyı denetleyiciden almanız gerekirse User, Denetleyici özelliğini kullanın . Görünümden ihtiyacınız varsa, özellikle ihtiyacınız olan şeyleri dolduracaktım ViewData, ya da sadece bir özelliği olduğunu düşündüğüm için Kullanıcı'yı arayabilirsiniz ViewPage.


2
"ya da ViewPage'in bir özelliği olduğunu düşündüğüm için Kullanıcı'yı arayabilirsiniz"
09:14

17
Evet, "Merhaba, @ User.Identity.Name!" cshtml'de.
Sean

198

Bunu buldum Userolduğunu, eserlerini, User.Identity.Nameya User.IsInRole("Administrator").


19
Sadece sen ya ihtiyacı olacak bir biçimde bir sınıf dışarıdan çalışıyorsanız, bu eklemek Imports System.Webdaha fazla ve birlikte ile hak HttpContext.Current.User.Identity.Namedoğrudan veya tam sözdizimi kullanarak nitelemek:System.Web.HttpContext.Current.User.Identity.Name
Paul

Bir Denetleyicinin içinde çalışır ve bir ViewModel kullanıyorsanız Denetleyiciden miras alırsanız veya Paul'ün önerisini uygularsanız.
usefulBee

60

Deneyin HttpContext.Current.User .

System.Web.HttpContext Olarak Ortak Paylaşılan Özellik Current ()
Üyesi

Özet:
Geçerli HTTP isteği için System.Web.HttpContext nesnesini alır veya ayarlar.

Dönen Değerler:
Geçerli HTTP isteği için System.Web.HttpContext


2
Görünüşe göre HttpContext "Current" adlı bir özelliğe sahip değil.
Serhat Ozgel

20
İkinizin iki farklı şeyden bahsettiğinize inanıyorum. System.Web.HttpContext ve statik özellik: System.Web.Mvc.Controller.HttpContext ("Geçerli" bir özelliği olmayan.
Jeff Sheldon

1
Bu MVC olmayan bir ortamda çalıştı, tam ihtiyacım olan şey. Teşekkürler! :)
Wagner da Silva

38

ASP.NET MVC4'te kullanıcının adını şöyle alabilirsiniz:

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

4
Bu hatayı alıyorsanız '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, bunun gibi mutlak bir çağrı yapmanızı öneririm System.Web.HttpContext.Current.User.Identity.Name.
Basit Sandman

21

Bunun gerçekten eski olduğunu anlıyorum, ama sadece ASP.NET MVC ile başlıyorum, bu yüzden iki sentimi yapıştıracağımı düşündüm:

  • Request.IsAuthenticated kullanıcının kimliğinin doğrulanıp doğrulanmadığını gösterir.
  • Page.User.Identity oturum açmış kullanıcının kimliğini verir.

16

Kullanırım:

Membership.GetUser().UserName

Bunun ASP.NET MVC'de çalışacağından emin değilim, ama denemeye değer :)


Bu Üyelik sınıfı nereden geliyor? IntelliSense varsayılan olarak tanımaz.
Serhat Ozgel

System.Web.Security ad alanı. Ben MVC yararlı bu olumlu değilim ama Web Formlar için giriş denetimleri ile kullanın.
Sean

1
Üyelik sağlayıcılarını kullanan herhangi bir ASP.NET uygulamasında kullanışlıdır.
jamiebarrow

2
Bu aslında bir veritabanı isteği yapar. HttpContext.Current.User bunu yapmaz.
Mike Cole

11

giriş kullanıcı adı: System.Web.HttpContext.Current.User.Identity.Name


9

Filtreleme amacıyla bir denetleyicide ASP.NET MVC 4'te yerleşik olan basit kimlik doğrulaması kullanılarak oluşturulan bir kullanıcı kimliğine başvurmak için (önce veritabanını ve ilk kod bağlamalarını oluşturmak için Entity Framework 5'i kullanıyorsanız ve tablolarınız userID için yabancı anahtar kullanıldıysa),

WebSecurity.CurrentUserId

using ifadesi ekledikten sonra

using System.Web.Security;

4
Ne yazık ki bu MVC 5 artık çalışmıyor gibi görünüyor. Emin değilim = /
Jed Grant

2
Yalnızca içinde System.Security.Principal.WindowsIdentity.GetCurrent().Nameçalışır MVC 5. Ancak bu, etki alanı adını kullanıcı adıyla alır. ie domain \ username
shaz

8

ASP.Net MVC'de oturum açmış olan kullanıcıyı almak için aşağıdaki kodu kullanabiliriz:

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

Ayrıca

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

Environment.UserName - Will Display format : 'Username'

7

Kullanıcı Adı:

User.Identity.Name

Ancak yalnızca kimliği almanız gerekiyorsa şunları kullanabilirsiniz:

using Microsoft.AspNet.Identity;

Böylece, doğrudan Kullanıcı Kimliğini alabilirsiniz:

User.Identity.GetUserId();

Bu yöntem, bir geri System.Guid
Gilberto B. Terra Jr

User.Identity.Name, id özelliği olmayan System.Security.Principal.IPrincipal örneğidir ... Bu Kullanıcı User.Identity.GetUserId Kullanıcı nesnesinden
Samra


5

Kullanın System.Security.Principal.WindowsIdentity.GetCurrent().Name.

Bu işlem, oturum açmış geçerli Windows kullanıcısını alır.


1
Bu kod soruyu cevaplayabilirken, bir bağlam eklemek, nasıl çalıştığını açıklamak ve ne zaman kullanılacağını açıklamak daha iyi olur. Yalnızca kod yanıtları uzun vadede yararlı değildir.
ryanyuyu

System.Security.Principal.WindowsIdentity.GetCurrent (). Name, Windows'da oturum açmış geçerli kullanıcıyı döndürür, OP şu anda web sitesinde oturum açmış olan kullanıcıyı ister.
GrandMasterFlush

4

Değer için, ASP.NET MVC 3'te yalnızca geçerli istek için kullanıcıyı döndüren Kullanıcı'yı kullanabilirsiniz.


4

Giriş sayfanızın içindeyseniz, örneğin LoginUser_LoggedIn olayında Current.User.Identity.Name boş bir değer döndürür, bu nedenle Oturum AçmaKontrolAdı.UserAdı özelliğini kullanmanız gerekir.

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

Bir intranette Active Directory'de çalışıyorsanız, işte bazı ipuçları:

(Windows Server 2012)

Bir web sunucusunda AD ile konuşan her şeyi çalıştırmak bir sürü değişiklik ve sabır gerektirir. Bir web sunucusunda yerel IIS / IIS Express'e karşı çalışırken AppPool'un kimliğinde çalıştığından, siteyi kimin isabet ettiğini taklit etmek için ayarlamanız gerekir.

ASP.NET MVC uygulamanız ağ içindeki bir web sunucusunda çalışırken geçerli oturum açmış kullanıcıyı etkin bir dizine alma:

// 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...

AD bilgisini almak için barındırma ortamı görevi görmesi için, 'etkin dizin bağlamı' ile ilgili olan çağrıları aşağıda belirtmeniz gerekir:

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

Ayrıca impersonateweb.config dosyasında true olarak ayarlamış olmanız gerekir :

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

Web.config dosyasında Windows kimlik doğrulamasının açık olması gerekir:

<authentication mode="Windows" />

Bu açıkça, Active Directory kullanıcı kimlik bilgilerinizi açıkça kullandığından inanmıyorum. Kullanıcılarınızın AD aracılığıyla kimlik doğrulaması yapılmasını istiyorsanız neden 'Formlar'a sahip olursunuz?
Beau D'Amore

Kuruluşumuzda, birkaç "saha" personeli tarafından paylaşılan birkaç iş istasyonumuzun bulunduğu yerler vardır. Bu nedenle, giriş sayfasını intranet web uygulamalarımıza eklememiz gerekiyor.
Patee Gutee

geçici bir çözüm olarak: bu uygulamanın iki kopyası olabilir, bunlardan biri kendi kimlik tablolarıyla 'Formlar' modunda olabilir veya her ikisini de tek bir uygulamada karıştırabilirsiniz, ancak daha zordur. Hızlı bir google bunu açıkladı: stackoverflow.com/questions/2250921/…
Beau D'Amore

<identity impersonate = "true" /> karıştırma durumunda değişmesi gerekebilir
Beau D'Amore

2

Asp.net Mvc Identity 2'de, geçerli kullanıcı adını şu yolla alabilirsiniz:

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

1

IIS Yöneticisi'nde Kimlik Doğrulama altında devre dışı bırakın: 1) Anonim Kimlik Doğrulama 2) Form Kimlik Doğrulaması

Ardından, sunucu dağıtımına karşı sınamayı gerçekleştirmek için denetleyicinize aşağıdakileri ekleyin:

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

if (url.Contains("localhost"))
  sUserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
else
  sUserName = User.Identity.Name;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.