2014-11-06 48 views
0

我可能在这里丢失了一些明显的东西。我对MVC和Web API都很陌生,所以我正在努力保持头脑清醒。CurrentPrincipal/User在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 
    } 
} 

现任校长总是空的,不管我如何尝试访问它。

回答

3

我认为你将需要设置线程和上下文主体。下面是我在做什么:

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

部分一路下跌This Article它说:

如果您的应用程序进行任何自定义验证逻辑,必须设置主要在两个地方:

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