asp.net - 在运行时,ASP.NET MVC更新 FormsAuthenticationTicket

  显示原文与译文双语对照的内容

我正在编写一个收费的MVC web应用程序,带有收费的自定义认证和授权。 用户登录网站时,我创建一个收费的FormsAuthenticationTicket,并将它的存储在一个收费的cookie


public void SignIn(string userName, bool createPersistentCookie, string UserData)


{


 if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.","userName");



//Create and tuck away the cookie


 FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddDays(15), createPersistentCookie, UserData);


//Encrypt the ticket.


 string encTicket = FormsAuthentication.Encrypt(authTicket);



////Create the cookie.


 HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);


 HttpContext.Current.Response.Cookies.Add(faCookie);


}



用户提供的用户定义字符串将是一个管道分隔字符串,并且它将始终包含至少两个项,用户标识| 命令 UserRole 。 用户可以被分配给一个或者多个角色,因此,用户定义的用户信息可以显示为用户| | UserRole UserRole

然后我在 Global.asax 中拥有自己的自定义通用


protected void Application_AuthenticateRequest(Object sender, EventArgs e)


{



//Get the authentication cookie


 string cookieName = FormsAuthentication.FormsCookieName;


 HttpCookie authCookie = Context.Request.Cookies[cookieName];



//If the cookie can't be found, don't issue the ticket


 if (authCookie == null) return;



//Get the authentication ticket and rebuild the principal


//& identity


 FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);



 string[] UserData = authTicket.UserData.Split(new Char[] { '|' });



 GenericIdentity userIdentity = new GenericIdentity(authTicket.Name);


 GenericPrincipal userPrincipal = new GenericPrincipal(userIdentity, UserData);


 Context.User = userPrincipal;


}



但是,在我的应用程序中,如果用户有多个角色,我需要列出它们的角色。

为了让用户选择方法,我想我可以通过这个角色,获得他们的英镑 FormsAuthenticationTicket,并更新用户的负担,以反映他们所选择的角色。 在用户select的情况下,我需要列出两个角色,然后向用户询问他们想要执行的功能,然后在他们的FormsAuthenticationTicket update用户。

这是可能的,还是有更好的方法来做这个?

任何帮助都将非常有用。

感谢大家。

时间: 原作者:

你可以随时改变 FormsAuthenticationTicket


HttpCookie cookie = FormsAuthentication.GetAuthCookie(Username, true);


var ticket = FormsAuthentication.Decrypt(cookie.Value);



var newticket = new FormsAuthenticationTicket(ticket.Version,


 ticket.Name,


 ticket.IssueDate,


 ticket.Expiration,


 true, 


"new user data",


 ticket.CookiePath);



cookie.Value = FormsAuthentication.Encrypt(newticket);


cookie.Expires = newticket.Expiration.AddHours(24);


HttpContext.Current.Response.Cookies.Set(cookie);



原作者:

我在评论中说,这是非常糟糕的可用性。 但是,如果你确定了这样做,那么dzenan的方法将工作在( 在用户选择了他想要的角色之后,你基本上只是去掉了所有其他角色) 。

另一种方法是向用户名添加另外一个字段,即 SelectedRole 。 然后创建一个包含这里字段的自定义 IPrincipal 。

另一种方法是将它存储为你自己的cookie,尽管我确保你验证了没有将用户授权的角色。

原作者:
...