我对 MVC 很陌生,并且很难让我的应用程序在我的登台网络服务器上运行。在我的本地机器和开发服务器上,它运行良好。
问题是在我的操作中,用户为空(在登台上,而不是在开发和本地上)。我用谷歌搜索了为什么用户会为空的原因,但一切似乎都涵盖了。奇怪的是它可以在两台服务器上完美运行。
这是我的代码...
在 Global.asax Using PostAcquireRequestState 中,我使用自定义主体覆盖了主体,该主体持有存储在 Session 中的对象。因此 SessionHelper 将获取对象并将其添加到主体。然后将主体设置为 httpcontext 和线程。
public class MvcApplication : HttpApplication
{
public MvcApplication()
{
PostAcquireRequestState += new EventHandler(MvcApplication_PostAcquireRequestState);
}
void MvcApplication_PostAcquireRequestState(object sender, EventArgs e)
{
if (Context.User is ICSPrincipal)
return;
var principal = new ICSPrincipal(new GenericIdentity(User.Identity.Name), SessionHelper.UserClaims);
HttpContext.Current.User = principal;
Thread.CurrentPrincipal = principal;
}
...
}
在我的控制器中,我将检索存储在主体中的值。但问题是我的登台服务器上的用户为空。但是它可以在我的本地机器和我的开发服务器上运行。开发服务器和登台服务器运行相同版本的 IIS,并且都安装了 MVC3。
public class HomeController : Controller
{
public ActionResult Index()
{
//PROBLEM!!! User is NULL on staging server.
var userClaims = ((ICSPrincipal)User).UserClaims;
...
}
}
有没有人有这个问题的经验并得到解决?我的印象是我可以从我的操作中安全地调用用户。
编辑:关于为什么我需要 SessionStorage 和自定义主体的情况草图。
我使用formsauthentication,因此涵盖了身份验证。但是,我曾经将一个包含额外用户数据(名字、姓氏;总共 6 个属性)的对象存储到来自身份验证 cookie 的用户数据中。然而,在调查我的请求时,我发现每个请求(甚至是图像)都超过 2.5KB。因此,我切换回仅将用户名存储在 cookie 中,并且在每次请求时,我都希望从会话存储中完成数据。这就是为什么我认为自定义主体会很棒。它从一个通用主体开始,一旦我们到达 Action,就会有一个自定义主体,其中包含我需要的所有数据来自我想要的任何地方(在这种情况下,来自 cookie 的用户名与来自会话的数据一起添加)。
我听到你说:但是,嘿,使用 Session 是不安全的,它会在一段时间后过期。我很清楚这一点,这就是为什么 SessionHelper 当然有一些智能。如果 Session 对象为 null,它将根据经过身份验证的用户的用户名获取所需的所有数据。它将这些数据存储在 Session 中,因此后续请求不会查询我的数据库。
我还使用 API 通信(http 或命名管道),这就是我在自定义主体中需要这些数据的原因。我无法从该层访问 Session,但我可以访问主体。因此,如果在进行该通信之前更新了主体,则一切正常。
解决实际问题:
上述设置实际上在多台机器上都可以正常工作,但在与我的开发服务器设置相同的登台服务器上却不行。在我的操作中分阶段投诉用户为空。我什至不知道这怎么可能。