控制器用户为空

时间:2012-04-12 18:16:32

标签: asp.net-mvc asp.net-mvc-3 model-view-controller controller httpcontext

我对MVC很新,并且很难让我的应用程序在我的登台网络服务器上运行。在我的本地计算机和开发服务器上运行正常。

问题是在我的Action中,User是null(在staging上,而不是在dev和local上)。我用google搜索用户为什么会为空的原因,但似乎一切都被覆盖了。奇怪的是它在2台服务器上运行良好。

这是我的代码......

在Global.asax中 使用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,因此涵盖了身份验证。但是,我曾经使用身份验证cookie存储一个对象,该对象将额外的userdata(firstname,lastname;总共6个属性)保存到userdata中。 无论如何调查我的请求,我看到每个请求(即使是图像;我知道我可以使用无Cookie域进行优化,但这是下一步)超过2.5KB。因此我切换回只在cookie中存储用户名,并且在每个请求中我希望从会话存储中完成数据。 这就是我认为自定义校长会很棒的原因。它从一个通用主体开始,一旦我们进入Action,就会有一个自定义主体,我需要的所有数据都来自我想要的地方(在这种情况下,来自cookie的用户名加入了来自会话的数据)。

我听到你说:但是,嘿,使用Session不安全,它会在一段时间后过期。我很清楚这一点,这就是为什么SessionHelper有一些情报。如果Session对象为null,它将根据经过身份验证的用户的用户名获取所需的所有数据。它不是将这些数据存储在Session中,因此后续请求不会查询我的数据库。

我还使用API​​通信(http或命名管道),这就是我在自定义主体中需要这些数据的原因。我无法从该层访问Session,但我可以访问该主体。因此,如果在进行该通信之前更新了主体,一切正常。

了解实际问题:

上面描述的这个设置实际上可以在多台机器上正常工作,但不能在我的登台服务器上工作,这与我的开发服务器设置相同。 在我的操作中暂停用户为空的投诉。我不知道那是怎么回事。

2 个答案:

答案 0 :(得分:2)

PostAcquireRequestState是一个奇怪的地方。你应该在AuthenticateRequest中这样做。你还应该设置Context.User而不是HttpContext.Current.User。

答案 1 :(得分:0)

http://support.microsoft.com/kb/980368/en

应用此修补程序后,ASP.NET 4应用程序可以处理无扩展URL请求。因此,在处理程序执行之前运行的托管HttpModule将运行。在某些情况下,HttpModules可以返回无扩展URL的错误。例如,编写为仅期望.aspx请求的HttpModule现在可能在尝试访问HttpContext.Session属性时返回错误。

这解决了这个问题!谢谢大家让我尝试多种设置。这样我想出了这个解决方案。