2013-10-29 2 views
0

로그인 정보가 있습니다. 사용자가 로그인 할 때 그는 두 가지 유형 중 하나를 선택하고 사용자 이름과 암호를 보내야합니다.mvc4 특정 데이터를 세션에 추가하십시오.

나는 그것을 할 수 있으며 사용자 인증을 위해 내 모델에 연결할 수 있습니다. 정확한 이름과 암호를 입력하면 다음을 수행합니다.

FormsAuthentication.SetAuthCookie(login.UserName, login.RememberMe); 

하지만 형식을 저장하려면 방법이 필요합니다. 나는 세션에서 그것을해야한다고 생각한다, 나는 맞다? 그리고 그렇다면 어떻게해야합니까? 그렇지 않다면 가장 좋은 방법은 무엇입니까?

답변

1

세션을 사용하려는 경우 Session을 사용할 수 있습니다.

아무 것도 저장할 수 있습니다. 원하는 경우 전체 로그인 객체를 저장할 수 있습니다.

Session["user"] = yourUser; 

세션은 각 사용자마다 고유하기 때문에 세션이 좋습니다.

웹 응용 프로그램에서 MemberShip 클래스를 사용하는 경우 문제에 가장 적합한 솔루션이라고 생각되는 맞춤 필드를 추가 할 수 있습니다. 이 example 또는 blog post을 참조하십시오. 이뿐 아니라 사용자 세션에 사용자 정보가 저장 될뿐만 아니라이 사용자 유형이 데이터베이스 내에 추가됩니다.

1

당신은 단순히 컨트롤러 내에서 Session 객체를 사용할 수 있습니다 : 당신은 사용자의 제비가있는 경우 (

Session["usertype"] = yourType; 

그러나 내가 저장 이러한 종류의 정보에 대한 사용자 정의 클래스를 사용하는 것이 당신이이 솔루션을 재 설계해야 세션 저장 위치 또는 온라인 사용자 데이터 위치를 전혀 재검토).

1

다릅니다. 사용자가 브라우저를 닫은 후에 저장된 "유형"이 필요합니까? 세션에서 저장하면 다음에 열 때 세션이 사라집니다.

저장이 필요하면 대신 쿠키를 사용하는 것이 가장 좋습니다.

this.Response.Cookies.Add(new HttpCookie("my-cookie-name", myValueToSave)); 
+0

"세션에서 저장하면 다음 번에 열 때 세션이 사라집니다." 그것은 그렇게 간단하지 않습니다. 그것은 세션 타임 아웃에 의존한다. 사용자는 쿠키를 삭제할 수도 있습니다. 이런 종류의 쿠키를 사용하는 또 다른 문제점은 각 http 요청에 대해 동일한 쿠키를 반복해서 보내야한다는 것입니다. 절대적으로 영구적으로 유지하려면 영구 저장 장치를 사용해야합니다. –

+0

맞습니다. 그다지 간단하지는 않지만, 그가 계속해야 할 필요가 있다면, 세션은 그것을 유지할 적절한 장소가 아닙니다. 이것은 Auth Cookie와 결합하여 쿠키에 저장하는 것이 더 합리적인 것 같았습니다. – Scottie

0

당신이 "자신의 유형을 저장"무엇을 의미합니까 :

쿠키를 추가하려면, 당신은 이런 식으로 뭔가를 할 것인가? 그의 역할을 의미합니까? 그래서 본질적으로 사용자는 애플리케이션에서 어떤 역할을합니까? 그것이 역할면 어쩌면 Authcookie에 그것을 저장하는 것이 올바른 장소입니다.추가 값을 인증 쿠키에 추가하거나 추가 값을 고려한 사용자 자신의 권한 부여 특성을 롤인하여 사용자 기본 개체에서 사용할 수 있습니다. public interface ICustomPrincipal : IPrincipal { Guid UserID {get; 세트; } string FirstName {get; 세트; } 문자열 성 {get; 세트; } string EmailAddress {get; 세트; } Guid CompanyID {get; 세트; } }

public class CustomPrincipal : ICustomPrincipal 
{ 
    public IIdentity Identity { get; private set; } 
    public bool IsInRole(string role) 
    { 
     return false; 
    } 

    public CustomPrincipal() 
    { 

    } 

    public CustomPrincipal(IIdentity indentity) 
    { 
     this.Identity = new GenericIdentity(indentity.Name); 
    } 
    public CustomPrincipal(string email) 
    { 
     this.Identity = new GenericIdentity(email); 
    } 
    public Guid UserID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string EmailAddress { get; set; } 
    public Guid CompanyID { get; set; } 
    public string CompanyName { get; set; } 
    public string JobTitle { get; set; } 


}`. 


public sealed class CustomAuthoriseAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     bool isAuthorized = base.AuthorizeCore(httpContext); 
     if (!isAuthorized) return false; 

     CustomPrincipal customPrincipal = null; 
     HttpCookie authCookie = httpContext.Request.Cookies[FormsAuthentication.FormsCookieName]; 

     if (authCookie != null) 
     { 
      FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
      var serializer = new JavaScriptSerializer(); 

      if (authTicket != null) 
      { 
       var serializeModel = serializer.Deserialize<CustomPrincipalSerializeModel>(authTicket.UserData); 

       customPrincipal = new CustomPrincipal(authTicket.Name) 
       { 
        UserID = serializeModel.UserID, 
        FirstName = serializeModel.FirstName, 
        LastName = serializeModel.LastName, 
        CompanyID = serializeModel.CompanyID, 
        EmailAddress = serializeModel.EmailAddress, 
        CompanyName = serializeModel.CompanyName, 
        JobTitle = serializeModel.JobTitle, 

       }; 
      } 
     } 


       HttpContext.Current.User = customPrincipal; 

     return isAuthorized; 
    } 
} 

public class CustomPrincipalSerializeModel 
{ 
    public Guid UserID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string EmailAddress { get; set; } 
    public Guid CompanyID { get; set; } 
    public string CompanyName { get; set; } 
    public string JobTitle { get; set; } 

} 

그럼 방법은 같은 것을 볼 수 있었다 로그인이

if (!membershipService.IsAccountLockedOut(loginModel.Email) && 
      membershipService.Login(loginModel.Email, loginModel.Password)) 
     { 
      UserDto user = membershipService.GetUserDetail(loginModel.Email); 
      var cookieContext = new CookieContext(); 
      cookieContext.SetAuthenticationToken(user); 
      //Need to check if user has reset thier password and needs to change it 
      if (!user.PasswordReset) 
      { 
       return RedirectToLocal(returnUrl); 
      } 
      else 
      { 
       return RedirectToAction("ChangePassword", "Account"); 
      } 
     } 
설정 인증 방법이

public void SetAuthenticationToken(UserDto userDto) 
    { 
     string userData; 
     string encTicket; 

     var serializeModel = new CustomPrincipalSerializeModel(); 
     serializeModel.UserID = userDto.ID; 
     serializeModel.FirstName = userDto.FirstName; 
     serializeModel.LastName = userDto.LastName; 
     serializeModel.EmailAddress = userDto.Email; 
     serializeModel.CompanyID = userDto.CompanyID; 
     serializeModel.CompanyName = userDto.Company; 
     serializeModel.JobTitle = userDto.JobTitle; 

     var serializer = new JavaScriptSerializer(); 
     userData = serializer.Serialize(serializeModel); 

     var autTicket = new FormsAuthenticationTicket(1, userDto.Email, DateTime.Now, 
                 DateTime.Now.AddMinutes(15), false, userData); 
     encTicket = FormsAuthentication.Encrypt(autTicket); 
     var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket); 
     cookie.HttpOnly = true; 
     HttpContext.Current.Response.Cookies.Add(cookie); 
    } 

같이 보입니다

당신이 여행 할 필요가 모든 데이터 당신의 응용 프로그램 전체에서 사용자는 인증 쿠키에서 사용할 수 있으며 CustomAuthorise 특성을 사용할 때마다 User 개체에서 사용할 수 있습니다.

[CustomAuthorise] 
    [OutputCache(NoStore = true, VaryByParam = "*", Duration = 0)] 
    public ActionResult Index() 
    { 

     var model = _someService.SomeFunction(User.CompanyID); //Company ID is from Auth Cookie 
     return View(model); 
    } 
관련 문제