당신이 "자신의 유형을 저장"무엇을 의미합니까 :
쿠키를 추가하려면, 당신은 이런 식으로 뭔가를 할 것인가? 그의 역할을 의미합니까? 그래서 본질적으로 사용자는 애플리케이션에서 어떤 역할을합니까? 그것이 역할면 어쩌면 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);
}
"세션에서 저장하면 다음 번에 열 때 세션이 사라집니다." 그것은 그렇게 간단하지 않습니다. 그것은 세션 타임 아웃에 의존한다. 사용자는 쿠키를 삭제할 수도 있습니다. 이런 종류의 쿠키를 사용하는 또 다른 문제점은 각 http 요청에 대해 동일한 쿠키를 반복해서 보내야한다는 것입니다. 절대적으로 영구적으로 유지하려면 영구 저장 장치를 사용해야합니다. –
맞습니다. 그다지 간단하지는 않지만, 그가 계속해야 할 필요가 있다면, 세션은 그것을 유지할 적절한 장소가 아닙니다. 이것은 Auth Cookie와 결합하여 쿠키에 저장하는 것이 더 합리적인 것 같았습니다. – Scottie