2010-11-18 3 views
1

사용자 지정 멤버십 공급자를 만들었으므로 UserName 대신 MembershipUser.ProviderUserKey을 사용하는 것이 더 편리합니다. 그래서, 같은 코드를 수행 ProviderUserKey을 검색 할 수 :ASP.NET User.Identity.Name 대안?

if (User.Identity.IsAuthenticated) 
{ 
    int UserID = (int)Membership.GetUser(User.Identity.Name).ProviderUserKey; 
} 

GetUser() 방법이 실행될 때, 사용자 데이터가 데이터베이스에서 검색해야하며이 나를 귀찮게한다. 이것은 서버 시간을 낭비하는 불필요한 것이며, 아무리 짧은 시간이라도 나는 그것을 피하고 싶습니다.

보다 편리한 방법으로 ProviderUserKey을 얻는 다른 방법이 있습니까? User.Identity.Name과 같은 경우가 있습니까?

귀하의 아이디어를 듣고 싶습니다. 귀하의 웹 페이지에서 어떻게이 문제를 해결합니까?

감사합니다.

답변

5

회원 정보 API가이 정보가 저장되어있는 유일한 위치이기 때문에 회원 정보 API가 데이터베이스에 연결됩니다. User.Identity.Name은 요청할 때마다 보내는 쿠키에서 기록 된 사용자 이름을 가져옵니다. 사용자 지정 일반 원칙을 구현하고 쿠키로 암호화 된 인증 티켓의 userData 부분에 필요한 정보를 저장할 수 있습니다. 이 주제를 다루는 article은 다음과 같습니다.

+0

감사합니다. 관련 정보를 알려주시겠습니까? 내가 발견 한 모든 것은 .NET 1.1에 관한 것이고 3.5 버전의 프레임 워크에서이 작업을하고 싶습니다. – Wodzu

+0

GenericPrincipal을 사용하고 쿠키에 추가 정보를 저장하는 방법을 보여주는 [한 기사] (http://www.xoc.net/works/tips/forms-authentication.asp)가 있습니다. 이 아이디어는 HttpContext.Current.User를이 사용자 지정 주체로 대체하여 모든 곳에서 액세스 할 수 있도록하는 것입니다. –

+0

고마워,하지만이 예제가 자신의 loign 컨트롤을 만드는 것을 기반으로 이해합니다. 표준 동작을 재정의해야합니다 ... 표준 로그인 컨트롤을 사용하면 어떨까요? 나중에 응용 프로그램에서 편리한 방식으로 다시 볼 수 있도록 하나의 속성을 추가로 표시하도록 클래스를 확장 할 수 있습니까? – Wodzu

3

처음으로 로그인하여 사용자의 세션 컬렉션에 저장하면 데이터베이스에서 ProviderUserKey을 읽으시겠습니까? 후속 요청에서 데이터베이스로 가지 않고도 세션에서 가져올 수 있습니다.

+0

나는 똑같은 생각하지만 우아한 방법은 어떻게 든 Identity 클래스를 확장하는 것입니다 ... – Wodzu

+0

Identity 클래스를 확장 할 때의 문제점은 사용자가 자신의 ID 클래스 대신 자신의 ID 클래스를 만들 수 없다는 것입니다. 그래서 자신 만의 IPrincipal을 만들어야합니다. 이 시점에서 모든 사용자 정의 코드의 잠재적 인 문제점이 성능상의 이점을 능가한다는 점을 고려해야합니다. – Greg