ASP.NET MVC에서 현재 사용자를 얻는 방법


268

양식 모델에서는 다음과 같이 현재 로그인 한 사용자를 가져 왔습니다.

Page.CurrentUser

ASP.NET MVC의 컨트롤러 클래스 내에서 현재 사용자를 얻으려면 어떻게해야합니까?

답변:


266

컨트롤러 내에서 사용자를 가져와야하는 경우 UserController 속성을 사용하십시오 . 보기에서 필요하면의 특정 항목을 구체적으로 채우 ViewData거나의 속성이라고 생각할 때 사용자에게 전화 할 수 있습니다 ViewPage.


2
"또는 ViewPage의 속성 인 것처럼 User를 호출 할 수 있습니다."-뷰에있을 때 Page.user를 사용한다는 의미입니까?
mawaldne

17
예, "Hi, @ User.Identity.Name!"처럼 사용할 수 있습니다. cshtml에서.
Sean

198

그 발견 User하다, 일을, User.Identity.Name또는 User.IsInRole("Administrator").


19
이것에 덧붙여서, 당신이 양식 이외의 클래스에서 일하고 Imports System.Web있다면와 함께 추가 자격을 갖추 HttpContext.Current.User.Identity.Name거나 전체 구문을 사용하여 직접 자격을 갖추어야합니다.System.Web.HttpContext.Current.User.Identity.Name
Paul

Controller 내부에서 작동하며 ViewModel을 사용하는 경우 Controller에서 상속하거나 Paul의 제안을 따릅니다.
유용한 Bee

60

시도하십시오 HttpContext.Current.User.

공용 공유 속성 Current () As System.Web.HttpContext System.Web.HttpContext의
멤버

요약 :
현재 HTTP 요청에 대한 System.Web.HttpContext 개체를 가져 오거나 설정합니다.

반환 값 :
현재 HTTP 요청에 대한 System.Web.HttpContext


2
분명히 HttpContext에는 "Current"라는 속성이 없습니다.
Serhat Ozgel

20
둘이 서로 다른 두 가지에 대해 이야기하고 있다고 생각합니다. System.Web.HttpContext 및 정적 속성 : System.Web.Mvc.Controller.HttpContext ( "현재"속성이없는 것
Jeff Sheldon

1
그것은 비 MVC 환경에서 작동했습니다. 감사! :)
바그너 다 실바

38

다음과 같이 ASP.NET MVC4에서 사용자 이름을 얻을 수 있습니다.

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

4
이 오류가 발생하면 다음 '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과 같이 절대 호출하는 것이 좋습니다 System.Web.HttpContext.Current.User.Identity.Name.
Simple Sandman

21

나는 이것이 실제로 오래되었다는 것을 알고 있지만 ASP.NET MVC를 시작하고 있습니다. 따라서 2 센트를 넣을 것이라고 생각했습니다.

  • Request.IsAuthenticated 사용자 인증 여부를 알려줍니다.
  • Page.User.Identity 로그인 한 사용자의 신원을 알려줍니다.

16

나는 사용한다:

Membership.GetUser().UserName

이것이 ASP.NET MVC에서 작동하는지 확실하지 않지만 한 번 볼만한 가치가 있습니다. :)


이 멤버십 클래스는 어디에서 왔습니까? IntelliSense는 기본적으로 인식하지 않습니다.
Serhat Ozgel

System.Web.Security 네임 스페이스 나는 이것이 MVC에서 유용하다고 생각하지 않지만 Web Forms의 로그인 컨트롤과 함께 사용합니다.
Sean

1
멤버 자격 공급자를 사용하는 모든 ASP.NET 응용 프로그램에서 유용합니다.
jamiebarrow

2
실제로 데이터베이스 요청이 이루어집니다. HttpContext.Current.User는하지 않습니다.
Mike Cole

11

로그인 사용자 이름 : System.Web.HttpContext.Current.User.Identity.Name


9

필터링 목적으로 컨트롤러에서 ASP.NET MVC 4에 내장 된 간단한 인증을 사용하여 생성 된 사용자 ID를 참조하기 위해 (데이터베이스를 먼저 사용하고 Entity Framework 5를 사용하여 코드 우선 바인딩을 생성하고 테이블을 구성하는 경우 유용합니다. userID에 대한 외래 키를 사용하는 경우)

WebSecurity.CurrentUserId

using 문을 추가하면

using System.Web.Security;

4
불행히도 이것은 MVC 5에서 더 이상 작동하지 않는 것 같습니다. 왜 그런지 모르겠습니다 = /
Jed Grant

2
System.Security.Principal.WindowsIdentity.GetCurrent().Name작동합니다 MVC 5. 그러나 사용자 이름으로 도메인 이름을 가져옵니다. 즉 domain \ username
shaz

8

다음 코드를 사용하여 ASP.Net MVC에서 현재 로그인 한 사용자를 가져올 수 있습니다.

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

또한

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

Environment.UserName - Will Display format : 'Username'

7

사용자 이름 :

User.Identity.Name

그러나 ID를 가져와야 할 경우 다음을 사용할 수 있습니다.

using Microsoft.AspNet.Identity;

따라서 사용자 ID를 직접 얻을 수 있습니다.

User.Identity.GetUserId();

이 메소드는 System.Guid를
Gilberto B. Terra Jr.

User.Identity.Name은 id 속성이없는 System.Security.Principal.IPrincipal의 인스턴스입니다 ...이 사용자는 User.Identity.GetUserId의 사용자 객체
Samra


5

사용하다 System.Security.Principal.WindowsIdentity.GetCurrent().Name .

현재 로그인 한 Windows 사용자가 표시됩니다.


1
이 코드는 질문에 대답 할 수 있지만 일부 컨텍스트를 포함하고 작동 방식을 설명하고 사용시기를 설명하는 것이 좋습니다. 코드 전용 답변은 장기적으로 유용하지 않습니다.
ryanyuyu

System.Security.Principal.WindowsIdentity.GetCurrent (). Name은 Windows에 로그인 한 현재 사용자를 반환하며 OP는 현재 웹 사이트에 로그인 한 사용자를 요청합니다.
GrandMasterFlush

4

가치있는 것을 위해 ASP.NET MVC 3에서는 현재 요청에 대한 사용자를 반환하는 User를 사용할 수 있습니다.


4

로그인 페이지에있는 경우 예를 들어 LoginUser_LoggedIn 이벤트에서 Current.User.Identity.Name은 빈 값을 반환하므로 yourLoginControlName.UserName 속성을 사용해야합니다.

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

4

다음 코드를 사용할 수 있습니다.

Request.LogonUserIdentity.Name;

그러면 응용 프로그램이 실행되는 AppPool의 사용자 이름이 표시됩니다.
Jason Geiger


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

인트라넷의 Active Directory에서 작업하는 경우 몇 가지 팁이 있습니다.

(Windows Server 2012)

웹 서버에서 AD와 통신하는 모든 것을 실행하려면 많은 변경과 인내가 필요합니다. 웹 서버에서 로컬 IIS / IIS Express를 실행할 때는 AppPool의 ID로 실행되므로 사이트를 방문한 사람을 사칭하도록 설정해야합니다.

ASP.NET MVC 응용 프로그램이 네트워크 내부의 웹 서버에서 실행될 때 활성 디렉토리에 현재 로그인 한 사용자를 가져 오는 방법 :

// 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 정보를 얻기 위해 호스팅 환경으로 작동하도록 다음에서 'Active Directory 컨텍스트'와 관련된 모든 호출을 래핑해야합니다.

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

impersonateweb.config에서 true로 설정 해야합니다 .

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

web.config에 Windows 인증이 있어야합니다.

<authentication mode="Windows" />

Active Directory 사용자 자격 증명을 명시 적으로 사용하고 있으므로 믿지 않습니다. AD를 통해 사용자를 인증하려면 왜 '양식'을 사용합니까?
Beau D' Amore

우리 조직에는 여러 "현장"직원이 공유하는 몇 개의 워크 스테이션이있는 위치가 있습니다. 따라서 인트라넷 웹 응용 프로그램에 로그인 페이지를 추가해야합니다.
Patee Gutee

해결 방법 :이 앱의 사본 두 개를 실행할 수 있습니다 (하나는 고유 한 ID 테이블이있는 '양식'모드). 또는 하나의 앱에서 둘 다 혼합 할 수 있지만 더 까다 롭습니다. 빠른 구글이 이것을 공개했다 : stackoverflow.com/questions/2250921/…
Beau D' Amore

<identity impersonate = "true"/> 믹싱하는 경우 변경해야 할 수도 있습니다
Beau D' Amore

2

Asp.net Mvc Identity 2에서 다음을 통해 현재 사용자 이름을 얻을 수 있습니다.

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

1

IIS 관리자의 인증에서 1) 익명 인증 2) 양식 인증을 비활성화합니다.

그런 다음 컨트롤러에 다음을 추가하여 테스트 및 서버 배포를 처리하십시오.

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

if (url.Contains("localhost"))
  sUserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
else
  sUserName = User.Identity.Name;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.