2012-09-12 3 views
1

안녕하세요, 저는 사용자 지정 멤버 자격 공급자 및 사용자 지정 역할 공급자를 사용하고 있습니다. 그리고 이것을 올바르게 사용하여 로그인하고 있습니다. 또한 다른 사용자 정보에 액세스 할 수 있도록 내 회원 전용 사용자 개체를 구현했으며 페이지를 변경할 때마다 모든 데이터를로드 할 필요가 없지만 현재는 제대로 작동하지 않습니다.사용자 지정 멤버십/역할 공급자를 사용할 때 사용자 지정 httpcontext 사용자를 사용하는 방법

public class User : MembershipUser 
{ 
    [Required(ErrorMessage = "Username cannot be blank")] 
    [Display(Name = "User name")] 
    public string UserName { get; set; } 

    [Required(ErrorMessage = "Password cannot be blank")] 
    [DataType(DataType.Password)] 
    [Display(Name = "Password")] 
    public string Password { get; set; } 

    [Display(Name = "User ID")] 
    public long UserID { get; set; } 

    [Display(Name = "Family Name")] 
    [StringLength(50, ErrorMessage = "Family name cannot be longer than 50 characters")] 
    public string FamilyName { get; set; } 

    [Display(Name = "Given Name")] 
    [StringLength(50, ErrorMessage = "Given name cannot be longer than 50 characters")] 
    public string GivenName { get; set; } 

    public Company Company { get; set; } 

    public virtual IIdentity Identity { get; set; } 
} 

그리고 사용자가 로그인 나는 다음 로그인 메소드를 호출에 :

[AllowAnonymous] 
    [HttpPost] 
    public ActionResult Login(User model, string returnUrl) 
    { 
     FormsAuthentication.SignOut(); 
     if(Membership.ValidateUser(model.UserName, model.Password)) 
     { 
      FormsAuthentication.SetAuthCookie(model.UserName, true); 
      return RedirectToAction("Index", ""); 
     } 
     ViewBag.Message = "Failed to login"; 
     return View(); 
    } 

을하지만 인덱스에 HttpContext.User를 호출 할 때 그냥 이름/ID를 포함하지 나머지는 아래에있는 내 사용자 개체입니다 내 사용자 개체의. 사용자 지정 FormAuthentication 개체를 만들어야합니까? 또는이 모든 사용자 정보를 HttpContext.Session 개체 안에 저장하는 것이 표준 프로세스입니까? 또는 내 사용자가 System.Security.Principle.IPrinciple을 연장하도록 하시겠습니까? 또는 심지어 Controller.TempData에? 또는 다른 곳에서 나는 익숙하지 않다. 사용자 데이터를로드 할 때마다 매번 데이터베이스에 도달해야합니다.

미안 이러한 것들이 명백한 질문이라면 나는 웹 개발을 처음 접했고 이러한 일을하는 일반적인 방법이 무엇인지 확신 할 수 없다. in build Authorize 속성을 사용하려고합니다.

답변

3

나는 내 자신의 정체성을 구현하여 만들었습니다. 그렇게하면 필요한만큼 속성을 추가하는 것이 쉽습니다. 다음은이

의 Global.asax에서
public class Identity : IIdentity 
    { 
     public Identity(int id, string name, string friendlyName, string roles) 
     { 
      this.ID = id; 
      this.Name = name; 
      this.FriendlyName = friendlyName; 
      this.Roles = roles; 
     } 



    public Identity(string name, string data) 
    { 
     if (string.IsNullOrWhiteSpace(data)) 
      throw new ArgumentException(); 

     string[] values = data.Split('|'); 
     if (values.Length != 3) 
      throw new ArgumentException(); 

     this.Name = name; 
     this.ID = Convert.ToInt32(values[0]); 
     this.FriendlyName = values[1]; 
     Roles = values[2]; 
    } 

    public string AuthenticationType 
    { 
     get { return "Custom"; } 
    } 

    public bool IsAuthenticated 
    { 
     get { return true; } 
    } 

    public override string ToString() 
    { 
     return FriendlyName; 
    } 

    public string GetUserData() 
    { 
     return string.Format("{0}|{1}|{2}", ID, FriendlyName, Roles); 
    } 


    public int ID { get; private set; } 
    public string Name { get; private set; } 
    public string FriendlyName { get; private set; } 
    public string Roles { get; private set; } 
} 

//in controller on login action: 
     Identity id = new Identity(user.ID, user.Username, "some friendly name", user.Roles); 
     DateTime expire = DateTime.Now.AddMinutes(FormsAuthentication.Timeout.TotalMinutes); 
     FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(id.ID, user.Username, DateTime.Now, expire, false, id.GetUserData()); 
     string hashTicket = FormsAuthentication.Encrypt(ticket); 
     HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashTicket); 
     HttpContext.Response.Cookies.Add(cookie); 

사용자 지정 속성의 FriendlyName와 코드 예제는 다음과 같습니다

public override void Init() 
     { 
      base.Init(); 
      PostAuthenticateRequest += new EventHandler(MvcApplication_PostAuthenticateRequest); 
     } 

    void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e) 
    { 
     HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 
     if (authCookie != null) 
     { 
      FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
      if (authTicket == null || authTicket.Expired) 
       return; 

      Identity id = new Identity(authTicket.Name, authTicket.UserData); 
      Principal user = new Principal(id); 
      Context.User = user; 
      Thread.CurrentPrincipal = user; 
     } 
    } 
+0

나는이 서로 다른/더 나은 방법으로 수행하지만,이 충분 입증 할 수있는 확신 나를 위해. – MiBu

+0

감사의 말을 전합니다. 비슷한 일을하고 있었지만 사용자 객체가 약 1000 자 정도이기 때문에 문제가있었습니다. 그래서 필요한 나머지 사용자 정보를 세션 객체에 넣기로 결정했습니다. – user1434177

+0

IsAuthenticated가 true를 반환하는 이유는 무엇입니까? – Dementic

관련 문제