gpt4 book ai didi

asp.net-mvc - 在 MVC2 中使用 FormsAuthenticationTicket cookie 自定义 IIdentity 和 IPrincipal

转载 作者:行者123 更新时间:2023-12-04 21:25:32 24 4
gpt4 key购买 nike

我目前正在尝试在 ASP.NET MVC2 Web 应用程序中实现一些自定义安全性。

我正在尝试做一些非常简单的事情,如下面的代码所示,但出于某种原因,如果我使用 [Authorize(Roles="Admins")]我的 Controller 操作之一的属性,请检查 Context.User.IsInRole("Admins")Page.User.IsInRole("Admins")它总是假的。
User.Identity.Name也很奇怪也是空白。

请参阅下面的代码,我在 cookie 中使用 FormsAuthenticationTicket,然后我将其用于 Application_AuthenticateRequest我的 Golabl.asax 中的事件句柄使用 GenericPrincipal 设置 Context.User目的。

我的登录代码:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Login(string username, string password)
{

//this would obviously do a check against the supplied username and password
if (true)
{
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, username, DateTime.Now,
DateTime.Now.AddMinutes(15), false, "Admins|Users|Members");

string encTicket = FormsAuthentication.Encrypt(ticket);

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

this.Response.Cookies.Add(cookie);
string url = FormsAuthentication.GetRedirectUrl(username, false);

Response.Redirect(url);
}


return View();

}

我的 Global.asax 代码:
        void MvcApplication_AuthenticateRequest(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
HttpContext context = application.Context;

var cookie = context.Request.Cookies[FormsAuthentication.FormsCookieName];

if (cookie != null)
{

// Get the authentication ticket
// and rebuild the principal & identity
FormsAuthenticationTicket authTicket =
FormsAuthentication.Decrypt(cookie.Value);
string[] roles = authTicket.UserData.Split(new Char[] { '|' });
GenericIdentity userIdentity = new GenericIdentity(authTicket.Name);
GenericPrincipal userPrincipal =
new GenericPrincipal(userIdentity, roles);

context.User = userPrincipal;

}

一旦我在上面设置了 context.User,我就可以在监视窗口中查看并且对象设置完美,以正确的角色使用正确的名称等,但是如果我尝试锁定 Controller 操作或从我站点的任何地方使用 Principal它总是设置为一个空字符串,没有分配角色!!

我猜我在这里做了一些非常愚蠢的事情,但如果有人能指出这一点,我将不胜感激。

最佳答案

检查您是否将新的 userPrincipal 分配给 global.asax 中 OnPostAuthenticate 请求中的 HttpContext 和当前线程:

HttpContext.Current.User = userPrincipal;
Thread.CurrentPrincipal = userPrincipal;

关于asp.net-mvc - 在 MVC2 中使用 FormsAuthenticationTicket cookie 自定义 IIdentity 和 IPrincipal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3945907/

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