현재 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
.