为什么HttpContext.User.Identity和当前用户会话对象在MVC api控制器中为空?

时间:2016-05-01 08:48:48

标签: asp.net-mvc asp.net-mvc-4 openid-connect

我正在现有的mvc应用程序中实现自定义身份验证(corp和使用openid connect实时)。要实现这一点,我使用的是Filter类,Home Controller,Default Controller(API)和Account controller。 Home Controller和Default控制器的装饰方式如下所示,这样我就可以在每次页面命中时授权用户。当用户访问该站点时,默认情况下将调用家庭控制器,然后将自动调用过滤器,我在那里授权用户并设置当前上下文用户,如下面的代码

public void OnAuthorization(AuthorizationContext filterContext)
{
        UserIdentities objIdentity = new ContextUser(userIdentity.EmailAddress);
        HttpContext.Current.User = new GenericPrincipal(objIdentity, null);
}

我能够在家庭控制器中获得身份(用户电子邮件)的价值,如下面的代码,

[AuthorizeFilter]
[ErrorFilter]
public class HomeController : Controller
{             
    [ValidateInput(false)]
    public ActionResult Index()
    {
        string userEmailAddress=((ContextUser)HttpContext.User.Identity).EmailAddress;
        return View();
    }          

}

一旦页面加载后,我调用默认控制器(API)方法通过传递用户电子邮件地址来获取下面代码的一些数据我无法在默认控制器中登录用户电子邮件地址,因为我总是得到空值。

[HttpGet]
    public string GetOrg()
    {
        //getting null value
        string a = RequestContext.Principal.Identity.Name; //null
        string b = HttpContext.Current.User.Identity.Name; //null
        string c = base.ControllerContext.RequestContext.Principal.Identity.Name;// null
        //I able to set the User Email Address session value in azurize filter but able to read in default controller.
        string d = HttpContext.Current.Request.RequestContext.HttpContext.Session["UserEmail"].ToString();//null
        return repository.FetchOrg(a or b or c or d);
    }

似乎所有的价值观都停留在APi控制器的某个地方,不知道我错过了什么以及我错在哪里。请告诉我。

1 个答案:

答案 0 :(得分:0)

在Global.asax.cs文件中添加以下代码后,我能够获得会话值。谢谢团队。

protected void Application_PostAuthorizeRequest()
{
        System.Web.HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
}