1

前段时间,我使用asp.net Web-api beta构建了API。我在某处读到,当在IIS中托管时,web-api继承了其运行的Web应用程序中的Identity。我的api也在一个网站上运行。使用测试版的二进制文件,当我登录到网站,然后移动到http://localhost:4343/webui/api/values它会返回给我登录用户的正确值。这里是值控制器的Get方法。使用新的ASP.NET Web API的主体

public IQueryable<string> Get() 
     { 
      var pr = Request.GetUserPrincipal(); 
      var username = Request.GetUserPrincipal().Identity.Name; //Null reference exception after installing vs 2012 here. Identity is null even though I am logged in 
      var values = GetUserValues(username); 
      return values.AsQueryable(); 
     } 

它曾经与web-api的beta版本正常工作,但与最终版本的vs2012它抛出空引用异常。我已将该网站转换为使用.net 4.5。任何想法发生了什么?

回答

1

HttpRequestMessage没有任何方法或扩展名,如GetUserPrincipal。我不确定是否有beta版。正如我从你的问题中了解到的,你的应用程序仍在运行测试版,这是一个完整的IMO灾难。

当您安装VS 2012时,Web API程序集已在您的计算机上进行了GAC。所以,你很有可能在那里发生冲突。

在另一方面,你可以通过下面的命令得到了认同:

var principal = Thread.CurrentPrincipal; 
+0

让我吃惊的是VS 2012在nuget中增加了'System.Net.Http.Formatting'和一些其他程序集。我也认为他们会被GACed,但可能他们不是。 'Thread.CurrentPrincipal'是我采用的路线,但我认为访问'User'属性是更清晰的方法。 –

5

的ApiController现在有一个名为“用户”,这是IPrincipal的财产。

var pr = User.Identity.Name; 

在内部,User属性调用tugberk提到的Thread.CurrentPrincipal。

+0

如何在'DelegatingHandler'中检查身份验证后设置User属性。 –

+0

在测试版中,我用'Request.Properties [HttpPropertyKeys.UserPrincipal] = new Generic Pricipal(..);'来编写。看起来委托人是从Http属性中删除的,不是? –

+0

只是好奇,为什么你要设置用户属性?是否需要进行单元测试? – omerthe1st