CurrentPrincipal / User在Web API服务中为空

时间:2014-11-06 19:04:42

标签: asp.net-mvc authentication asp.net-web-api principal

我可能会遗漏一些明显的东西。我是MVC和Web API的新手,所以我正在努力保持头脑清醒。

我有一个与Web API服务接口的MVC应用程序。身份验证将由内部开发的登录服务处理。工作时,MVC客户端应检查当前用户是否已通过身份验证。如果他们不是,那么它将重定向到此登录服务,该服务应该对用户进行身份验证并更新当前用户。然后,我需要能够从Web API服务访问此身份。

我假设MVC应用程序中的当前主体(通过Thread.CurrentPrincipal或HTTPContext.Current.User设置)应该在我的Web API服务中可用,但每当我尝试从服务,校长是空的。我尝试使用以下所有选项从服务中访问主体,但它始终为空:
RequestContext.Principal
User.Identity
HttpContext.Current.User

Thread.CurrentPrincipal中
这是我的代码的基本思想:

MVC Controller:
public ActionResult Index() {
   //Just create a test principal here to see if it's available in the service
   IPrincipal temp = new GenericPrincipal(new GenericIdentity("myUserName"), new string[]{});
   Thread.CurrentPrincipal = temp;

   using (var client = new HttpClient()) {
      client.BaseAddress = new Uri("myServiceAddress");
      HttpResponseMessage response = client.GetAsync("resourceString")).Result;
      ...Code to deal with result
   }
}



Web API Controller:
[HttpGet]
public HttpResponseMessage MyAction() {
   if (User.Identity == null || !User.Identity.IsAuthenticated) {
      //So sad
   } else {
      //Do some work
   }
}

无论我如何尝试访问它,当前主体始终为空。

1 个答案:

答案 0 :(得分:4)

我认为您需要同时设置线程和上下文主体。这就是我正在做的事情:

private static void SetPrincipal(IPrincipal principal)
{
    Thread.CurrentPrincipal = principal;
    if (HttpContext.Current != null) {
        HttpContext.Current.User = principal;
    }
}

部分向下This Article它说:

如果您的应用程序执行任何自定义身份验证逻辑,则必须在两个位置设置主体:

  • Thread.CurrentPrincipal中。此属性是在.NET中设置线程主体的标准方法。
  • HttpContext.Current.User。此属性特定于ASP.NET。