5

질문 :양식 인증을 사용하여 현재 사용자 ID (이름 아님) 가져 오기?

양식 인증과 내 자신의 맞춤 멤버십 공급자를 가지고 놀고 있습니다.

System.Web.Security.FormsIdentity veryFunny= (System.Web.Security.FormsIdentity) 
    System.Web.HttpContext.Current.User.Identity; 

을 그리고 나는이 일을 현재의 회원 사용자를 얻을 수 있습니다 : 내가 보는 것과

, 나는 수행하여 현재 FormsIdentity를 얻을 수

 var UserFromDb = System.Web.Security.Membership.GetUser(); 

그리고 나서이 사용자 ID를 얻을 수 있습니다 이렇게하면 :

var MyUserId = UserFromDb.ProviderUserKey; 

재미있는 것은 내가 Membership.GetUser()를 호출하면 멤버십 공급자에서이 메서드를 호출합니다.

public override MembershipUser GetUser(string username, bool userIsOnline) 

데이터베이스에서 사용자 정보를 조회합니다. 내가 생각 그래서
는 .NET 프레임 워크는 내부적으로 사용자 이름에 따라 데이터베이스에서 사용자 정보를 얻을 수

GetUser(System.Web.HttpContext.Current.User.Identity.Name, whatever); 

을 수행한다는 것이다. 전체 사용자를 검색하여 사용자 ID를 얻으려고 할 때 성능에 좋지 않기 때문에 처음에는 이런 일이 혼란 스럽습니다.

둘째로, 내가 기대하는 바가 아니기 때문에 두 번째로 사용자 ID를 조회해야한다는 것이 불안해합니다.

셋째, 사용자 이름이 프로그램 과정에서 변경 될 수 있고, 사용자가 로그 아웃하고 로그인해야 할 필요가 없으므로 방해가됩니다.

이제 나에게이 디자인은 헛소리처럼 들립니다.
그러나 Microsoft는 응용 프로그램 이름, 그룹 이름 및 사용자 이름을 기본 키로 사용하므로 많은 의미가 없습니다.

여기 내 질문 :
DB 조회없이 사용자 ID를 가져 오는 방법이 없습니까?

회원 자격 아이디어 전체가 설계 상 너무 파괴 되었습니까?

이렇게 깨진 경우 :
FormsIdentity에는 userdata라는 문자열 속성이 있습니다. 그렇다면 어떻게 ASP.NET을 사용하여 거기에 사용자 ID를 저장할 수 있습니까?

+6

ASP.NET 멤버 자격 공급자에 오신 것을 환영합니다. 이러한 공급자의 고품질 디자인 사례를 찾는 것은 실망 스러울 수 있습니다. –

답변

2

예, 해결 방법은 here입니다.
Auth cookie-Ticket UserData에 UserId를 설정할 수 있습니다.

public class UserData 
{ 
    public string FirstName { get; set; } 
    public UserData() 
    { 
     FirstName = "Unknown"; 
    } 
} // End Class UserData 



public void SignIn(string userName, bool createPersistentCookie) 
{ 
    if (String.IsNullOrEmpty(userName)) 
     throw new ArgumentException("Der Wert darf nicht NULL oder leer sein.", "userName"); 

    UserData userData = new UserData(); 
    SetAuthCookie(userName, createPersistentCookie, userData); 
    //FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 
} 


public void SetAuthCookie(string userName, bool createPersistentCookie, UserData userData) 
{ 
    HttpCookie cookie = FormsAuthentication.GetAuthCookie(userName, createPersistentCookie); 
    FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value); 
    FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(
     ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration 
     ,ticket.IsPersistent, userData.ToJSON(), ticket.CookiePath 
    ); 

    string encTicket = FormsAuthentication.Encrypt(newTicket); 
    cookie.Value = encTicket; 
    System.Web.HttpContext.Current.Response.Cookies.Add(cookie); 
} // End Sub SetAuthCookie 

또 다른 가능성은 UserId.ToString()을 "이름"으로 사용하는 것입니다.

+3

하지만 userData를 어떻게 검색합니까? – bflemi3