gpt4 book ai didi

asp.net - MVC 在运行时更新 FormsAuthenticationTicket UserData

转载 作者:行者123 更新时间:2023-12-03 15:59:47 27 4
gpt4 key购买 nike

我正在写一个 MVC 4 带有 的 Web 应用程序自定义认证授权 .当用户登录该站点时,我创建了一个 FormsAuthenticationTicket 并将其存储在 中 cookies

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);
}

用户数据 string 将是一个管道分隔的字符串,它总是至少包含两个项目, 用户名 |用户角色 .一个用户可以被分配到一个或多个角色,因此,UserData 可能看起来像这样 用户名 |用户角色 |用户角色 |用户角色

然后我有了自己的自定义 通用主体在 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 并更新 用户数据 以反射(reflect)他们选择的角色。例如, 用户数据 字符串是用 创建的1|经理|申请人 ,然后我需要列出两个角色并询问用户他们想要在哪个角色下执行功能,他们选择 经理 然后我更新他们的 用户数据 在他们的 FormsAuthenticationTicket 1|经理 .

这甚至是可能的,还是有更好的方法来做到这一点?

任何帮助将不胜感激。

谢谢大家。

最佳答案

您可以随时更改 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);

关于asp.net - MVC 在运行时更新 FormsAuthenticationTicket UserData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14855688/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com