현재 사용자를 얻는 방법과 MVC5에서 User 클래스를 사용하는 방법은 무엇입니까?


159
  • MVC 5 에서 현재 로그인 한 사용자의 ID를 어떻게 얻을 수 있습니까? StackOverflow 제안을 시도했지만 MVC 5가 아닌 것 같습니다.
  • 또한 사용자에게 물건을 할당하는 MVC 5 모범 사례는 무엇입니까? (예를 들어 User있어야한다 Items.해야 내가 저장 한 사용자 IdItem? 깡통 나는 연장 User와 클래스를 List<Item>탐색 속성?

MVC 템플릿에서 "개별 사용자 계정"을 사용하고 있습니다.

이것을 시도했다 :

'Membership.GetUser ()'가 null입니다.


내가 시도한 것에 대한 참조를 추가했습니다. 마지막 것은 MVC4에서는 정상이지만 MVC5에서는 그렇지 않았습니다. 또한 "사용자 사용"에 대한 모범 사례가 필요합니다. :)
Adam Szabo

MVC 5를 사용한다고 말하면 멤버십에 무엇을 사용하고 있습니까? OWin. 보안?
Aron

MVC 템플릿의 "개별 사용자 계정"
Adam Szabo

3
HttpContext.Current.User.Identity.Name현재 기록 된 사용자의 이름입니다.
Wiktor Zychla

1
ID 를 얻는 방법 ? 현재 사용자를 Item자신이 만든 사용자에게 할당하고 싶지만 사용자 이름을 기반으로하지는 않습니다 (변경 될 수 있음). `HttpContext.Current 'System.Web.HttpContextBase'에 'Current'에 대한 정의가 포함되어 있지 않고 'System.Web.HttpContextBase'유형의 첫 번째 인수를 허용하는 확장 메소드 'Current'가없는 방식으로 작동하지 않습니다. using 지시문이나 어셈블리 참조가 누락 되었습니까?)`. 귀하의 솔루션이 MVC 5를위한 것입니까?
Adam Szabo

답변:


313

ASP.NET MVC 컨트롤러에서 코딩하는 경우

using Microsoft.AspNet.Identity;

...

User.Identity.GetUserId();

가치가 있다고 언급 User.Identity.IsAuthenticated하고 User.Identity.Name언급 위의 추가없이 작동합니다 using문. 그러나 GetUserId()그것 없이는 존재하지 않을 것입니다.

컨트롤러 이외의 클래스에있는 경우

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

MVC 5의 기본 템플릿에서 사용자 ID는 문자열로 저장된 GUID입니다.

아직 모범 사례는 없지만 사용자 프로필 확장에 대한 유용한 정보를 찾았습니다.


9
ASP.NET MVC 5의 사용자 인증 및 권한 부여가 변경되었습니다. 이제는 EF 또는 다른 공급자와 함께 사용할 수있는 인터페이스 및 일반 리포지토리가 포함 된 클레임 기반 인증입니다 (EF 구현이 기본값으로 제공됨). 보낸 사람 GetUserId의 하단에 저장된 확장 방법 Ass_Start\IdentityConfig.cs당신이 개의 다른 네임 스페이스에, 당신은 설정해야하는 경우, 그것을 사용할 필요가 어디에 있든, using Microsoft.AspNet.Identity눈에 보이는되기 위해 연장.
앤더슨 마토스

1
survey.UserId = Guid.Parse (User.Identity.GetUserId ());
NicoJuicy

사용 참조를 추가하면 사용자가 여전히 빨간색 밑줄이 표시됩니까? 왜 이럴까요?
Zapnologica

@ Zapnologica : VS IntelliSense가 약간 느릴 수 있습니다.
Adam Szabo

5
참고 사용자가 컨트롤러에서만 사용할 수 있습니다 msdn.microsoft.com/en-us/library/... (@Zapnologica 당신은 컨트롤러의 외부를 사용하는 HttpContext.Current.User.Identity.GetUserId을 (시도);?)
Adween

28

다음과 같은 것을 시도하십시오 :

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

RTM과 함께 작동합니다.


11
불필요한 데이터베이스 트립이 발생합니다.
Arash

3
@ Arash, 응용 프로그램은 데이터베이스에 접속하지 않고 어떻게 사용자의 객체를 가져와야합니까?
fabspro

2
@Arash 신경 쓰지 마, 무슨 말인지 알 겠어. ID는 User.Identity.GetUserId ()로 검색 할 수 있습니다. 데이터베이스 트립없이.
fabspro

mvc5 (멤버쉽 2)를 기억하십시오. User.Identity.GetUserId ()는 [AspNetUsers] 테이블의 id와 다릅니다. Jakub Arnold와 Rok가 올바른 방법입니다
Gray Wolf

나는 대답과 약간 혼동된다. 컨트롤러 컨텍스트에 UserStore 유형이없는 것 같습니다. 어떤 아이디어?
Jhourlad Estrella

19

한 줄의 코드로 ApplicationUser 개체를 사용하려면 (최신 ASP.NET Identity가 설치되어있는 경우) 다음을 시도하십시오.

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

다음 using 문이 필요합니다.

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;

<ApplicationUserManager>에 대한 객체를 찾을 수 없음
Fandango68

7

ID를 얻는 것은 매우 간단하며 해결했습니다.

두 번째 질문은 조금 더 복잡합니다.

따라서 이것은 현재 시험판이지만 모든 문제는 사용자가 새로운 속성 (또는 문제가있는 항목 모음)으로 사용자를 확장하는 것입니다.

기본적으로라는 파일이 있습니다. IdentityModel Models 폴더 아래에 이 작성됩니다 (작성 당시). 거기에는 몇 개의 수업이 있습니다. ApplicationUser그리고 ApplicationDbContext. 컬렉션을 추가하려면 클래스가 Entity Framework와 함께 사용하는 일반 클래스 인 것처럼 클래스 Items를 수정해야합니다 ApplicationUser. 실제로, 당신이 후드를 간단히 살펴보면 모든 신원 관련 클래스 (사용자, 역할 등 ...)가 적절한 데이터 주석이있는 POCO 일 뿐이므로 EF6과 잘 어울립니다.

다음으로 AccountController생성자가 DbContext를 사용하도록 알 수 있도록 생성자 를 약간 변경해야합니다 .

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

이제 로그인 한 사용자의 전체 사용자 개체를 얻는 것은 정직한 것이 좀 난해합니다.

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

이 라인은 작업을 완료하고 userWithItems.Items원하는대로 액세스 할 수 있습니다.

HTH


시험판 문서와 같은 것이 있다고 생각하지 않습니다.
Derek Tomes 1

@Derek Tomes-내가 만난 것은 아닙니다. 11 월 13 일까지 실제 문서를 기다려야한다고 생각합니다. 정직한 것은 좋지 않습니다. uservoice (aspnet.uservoice.com/forums/41199-general-asp-net/suggestions/)를 통해 더 나은 지침을 요청 하기도합니다.
EightyOne Unite

좋아, 어떻게 유형의 인스턴스에 도착 AccountController합니까?
둥지

0

당신의 고통을 느낍니다. 같은 일을하려고합니다. 제 경우에는 사용자를 지우고 싶습니다.

모든 컨트롤러가 상속하는 기본 컨트롤러 클래스를 만들었습니다. 그것에 나는 재정의 OnAuthentication하고 설정filterContext.HttpContext.User to null

그게 내가 관리했던 최고야

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;
        }
    }
    ...
}

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;

주석없이 코드를 게시하지 마십시오. 코드를 설명하면 더 도움이 될 것입니다.
Ali Kanat

0

다른 사람 이이 상황에 처한 경우 : 내 사용자가 아직 로그인하지 않도록 내 앱에 로그인하기 위해 이메일 확인을 작성하고 있지만 아래에서 @firecape 솔루션의 변형 인 로그인에 입력 된 이메일을 확인했습니다.

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

또한 다음이 필요합니다.

using Microsoft.AspNet.Identity;

using Microsoft.AspNet.Identity.Owin;

0

.Net MVC5 core 2.2에서는 HttpContext.User.Identity.Name을 사용합니다. 그것은 나를 위해 일했다.


0

이것이 내가 AspNetUser ID를 얻어 내 홈페이지에 표시 한 방법입니다

HomeController Index () 메서드에 다음 코드를 배치했습니다.

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

보기 페이지에서 전화

ViewBag.userId 

프로젝트를 실행하면 userId를 볼 수 있습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.