[C#] ASP.NET MVC 5-신원. 현재 ApplicationUser를 얻는 방법

프로젝트에 ApplicationUser이라는 속성 을 가진 기사 엔터티가 Author있습니다. 현재 기록 된 전체 개체를 얻으려면 어떻게 ApplicationUser해야합니까? 새 기사를 만드는 동안 Author속성을 Articlecurrent 로 설정해야 합니다 ApplicationUser.

이전 멤버십 메커니즘에서는 간단했지만 새로운 ID 접근 방식에서는이를 수행하는 방법을 모릅니다.

나는 이런 식으로 시도했다.

  • 신원 확장을위한 using 문 추가 : using Microsoft.AspNet.Identity;
  • 그런 다음 현재 사용자를 얻으려고합니다. ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == User.Identity.GetUserId());

그러나 다음과 같은 예외가 있습니다.

LINQ to Entities는 ‘System.String GetUserId (System.Security.Principal.IIdentity)’메소드를 인식하지 못하므로이 메소드를 상점 표현식으로 변환 할 수 없습니다. Source = EntityFramework



답변

현재 ApplicationUser에 대해 데이터베이스를 직접 조회 할 필요는 없습니다.

이는 초보자를위한 추가 컨텍스트를 갖는 새로운 종속성을 도입하지만 사용자 데이터베이스 테이블 변경 (지난 2 년 동안 3 번)을 진행하지만 API는 일관됩니다. 예를 들어, users테이블은 이제라고 AspNetUsers신원 프레임 워크에, 여러 기본 키 필드의 이름은 더 이상 작동하는 몇 가지 답변의 코드, 그래서 계속 변화 -그대로 .

또 다른 문제는 데이터베이스에 대한 기본 OWIN 액세스가 별도의 컨텍스트를 사용하므로 별도의 SQL 액세스에서 변경하면 유효하지 않은 결과가 발생할 수 있습니다 (예 : 데이터베이스에 대한 변경 사항이 표시되지 않음). 다시 한 번 해결책은 제공된 API를 사용 하여 해결 하는 것입니다.

현재 날짜와 같이 ASP.Net ID에서 현재 사용자 개체에 액세스하는 올바른 방법은 다음과 같습니다.

var user = UserManager.FindById(User.Identity.GetUserId());

또는 비동기 작업이있는 경우 다음과 같습니다.

var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());

FindById비동기식이 아닌 UserManager메소드를 사용할 수 있도록 다음 using 문이 필요합니다 ( UserManager의 확장 메소드 이므로이를 포함하지 않으면 FindByIdAsync) 만 표시 됩니다.

using Microsoft.AspNet.Identity;

컨트롤러에 전혀없는 경우 (예 : IOC 주입을 사용하는 경우) 다음에서 사용자 ID를 완전히 검색합니다.

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

표준 계정 컨트롤러가 아닌 경우 컨트롤러에 다음을 추가해야합니다 (예 :).

1.이 두 속성을 추가하십시오 :

    /// <summary>
    /// Application DB context
    /// </summary>
    protected ApplicationDbContext ApplicationDbContext { get; set; }

    /// <summary>
    /// User manager - attached to application DB context
    /// </summary>
    protected UserManager<ApplicationUser> UserManager { get; set; }

2. 이것을 Controller의 생성자에 추가하십시오 :

    this.ApplicationDbContext = new ApplicationDbContext();
    this.UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.ApplicationDbContext));

2015 년 3 월 업데이트

참고 : 최신 Identity 프레임 워크 업데이트는 인증에 사용되는 기본 클래스 중 하나를 변경합니다. 현재 HttpContent의 Owin 컨텍스트에서 액세스 할 수 있습니다.

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

추가:

원격 데이터베이스 연결 (예 : Azure 데이터베이스에 대한 로컬 호스트 테스트)을 통해 Azure에서 EF 및 Identity Framework를 사용하는 경우 두려운 “오류 : 19-물리적 연결을 사용할 수 없습니다”라는 오류가 임의로 발생할 수 있습니다. 재 시도를 추가 할 수없는 (또는 누락 된 것으로 보이는) Identity Framework 내부에 원인이 묻혀 있으므로 프로젝트에서 .Include(x->someTable)사용자 정의를 구현해야합니다 SqlAzureExecutionStrategy.


답변

내 실수는 LINQ 쿼리 내부에서 메서드를 사용해서는 안됩니다.

올바른 코드 :

using Microsoft.AspNet.Identity;


string currentUserId = User.Identity.GetUserId();
ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId);


답변

그것은 답변의 의견에 있지만 아무도 이것을 실제 해결책으로 게시하지 않았습니다.

맨 위에 using 문을 추가하기 만하면됩니다.

using Microsoft.AspNet.Identity;


답변

Ellbar의 코드가 작동합니다! 사용 만 추가하면됩니다.

1 – using Microsoft.AspNet.Identity;

그리고 … 엘바의 코드 :

2- string currentUserId = User.Identity.GetUserId();
ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId);

(이 코드로 currentUser), 당신은 당신이 여분의 데이터를 원하는 경우 … 연결된 사용자의 일반 데이터를 작동 볼 이 링크를


답변

ASP.NET Identity 3.0.0부터는 리팩토링되었습니다.

//returns the userid claim value if present, otherwise returns null
User.GetUserId();


답변

ApplicationDbContext context = new ApplicationDbContext();
var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
ApplicationUser currentUser = UserManager.FindById(User.Identity.GetUserId());

string ID = currentUser.Id;
string Email = currentUser.Email;
string Username = currentUser.UserName;


답변

MVC 5의 경우 WebApplication 템플릿 스캐 폴드에서 ManageController의 EnableTwoFactorAuthentication 메소드를 살펴보십시오.

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> EnableTwoFactorAuthentication()
        {
            await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), true);
            var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
            if (user != null)
            {
                await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
            }
            return RedirectToAction("Index", "Manage");
        }

대답은 Microsoft 자체에서 제안한대로 있습니다.

var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());

ApplicationUser 클래스에 정의한 모든 추가 속성이 있습니다.