gpt4 book ai didi

c# - BeginRequest 中的 HTTPContext 用户集在 Controller 中不可用

转载 作者:太空宇宙 更新时间:2023-11-03 13:42:24 24 4
gpt4 key购买 nike

我正在使用一种有点自制的用户身份验证方法。对用户进行身份验证后,在 C# 中设置身份验证票证。

FormsAuthenticationTicket authenticationTicket = new FormsAuthenticationTicket(1, viewModel.Email, DateTime.Now, DateTime.Now.AddHours(48), true, String.Join("|", roles));
string encryptedTicket = FormsAuthentication.Encrypt(authenticationTicket);
HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
Response.Cookies.Add(authCookie);

请注意,角色是一个字符串列表,由该用户的可用角色构建而成(角色不在同一个用户表中 - 例如,有一组条件定义用户“角色”)。

接下来,在 Global.asax 的 Application_BeginRequest 方法中,我有以下内容:

// Extract the forms authentication cookie
string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = Context.Request.Cookies[cookieName];

if (null == authCookie)
{
return;
}

FormsAuthenticationTicket authTicket = null;
try
{
authTicket = FormsAuthentication.Decrypt(authCookie.Value);
}
catch (Exception ex)
{
return;
}

if (null == authTicket)
{
return;
}
string[] roles = authTicket.UserData.Split(new char[] { '|' });

FormsIdentity id = new FormsIdentity(authTicket);

GenericPrincipal principal = new GenericPrincipal(id, roles);
HttpContext.Current.User = principal;

基本上是通过 authticket 设置用户的当前上下文。但是,当我为 MVC 类执行自定义 Authorize 属性时,我首先遇到了一个问题,我注意到未设置 HTTPContext 的用户。

然后我注意到在每个操作中,用户也没有设置。但是,通过逐步执行我的代码,我可以清楚地看到用户在身份验证票证中被发现并被解密并存储在上下文变量中。但是当我在任何 Controller 中进行操作时,用户已经从上下文中消失了。

编辑:还应注意,在 HTTPContext 上设置的其他值确实会转移到 Controller 。例如这条线

HttpContext.Current.AllowAsyncDuringSyncStages = false; // Or true

将把我设置的任何内容带入 Controller 操作中。似乎只有用户被屏蔽了。

最佳答案

Application_BeginRequest 不是设置 HttpContext.Current.User 的有效位置,因为它将在授权期间被覆盖。

您需要在Application_AuthorizeRequest中实现上面的代码,例如引用下面的代码。然后它将在 Controller 中可用。

 public MvcApplication()
{
this.AuthorizeRequest += MvcApplication_AuthorizeRequest;
}

void MvcApplication_AuthorizeRequest(object sender, EventArgs e)
{
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket("test", true, 30);
FormsIdentity id = new FormsIdentity(authTicket);

GenericPrincipal principal = new GenericPrincipal(id, new string[] { });
HttpContext.Current.User = principal;
}

关于c# - BeginRequest 中的 HTTPContext 用户集在 Controller 中不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16502966/

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