프로젝트에 ApplicationUser
이라는 속성 을 가진 기사 엔터티가 Author
있습니다. 현재 기록 된 전체 개체를 얻으려면 어떻게 ApplicationUser
해야합니까? 새 기사를 만드는 동안 Author
속성을 Article
current 로 설정해야 합니다 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 클래스에 정의한 모든 추가 속성이 있습니다.