技术:ASP.Net Web API 2身份验证。
IDE :我在Visual Studio 2013中使用SPA模板。
故事:我添加了一个带有一个Get方法的控制器(请参阅代码)并执行测试以打印“System.Threading.Thread.CurrentPrincipal.Identity.Name”。 最终游戏是找到调用API的客户端的身份。
问题:为什么身份显示为空?是否与呼叫在不同的线程上提供的事实相关?令牌(客户端在登录时收到的)是请求的一部分并用于身份验证吗?
为了清晰起见,我试着保持简短,所以如果您需要更多信息,请告诉我。
public class abcController : ApiController
{
// GET api/abc
public IEnumerable<string> Get()
{
return new string[]
{ System.Threading.Thread.CurrentPrincipal.Identity.Name.ToString(),
"My Try"
};
}
好的,我找到了解决方法(不是解决方案)。基本上,删除此行“config.SuppressDefaultHostAuthentication();”。 http://forums.asp.net/p/1944393/5594350.aspx?Re+Web+API+2+how+do+I+find+the+identity+of+an+authenticated+user+
答案 0 :(得分:0)
尝试从HttpRequestMessage对象获取标识,而不是从当前线程获取标识:
public IEnumerable<string> Get()
{
return new string[]
{
this.Request.GetRequestContext().Principal.Identity.Name
};
}
Web Api 2中不再提供静态方法HttpContext。
答案 1 :(得分:0)
在javascript方面,在webapi调用中你要确保你在app.datamodel.js中调用他们的getSecurityHeaders函数,就像这样(当然他们已经登录后):
var getabc = function () {
return $.ajax("api/abc", {
type: "GET",
headers: getSecurityHeaders()
});
};
如果你没有调用他们的getSecurityHeaders()函数,那么Identity将为null。
为了完整性,这是函数:
function getSecurityHeaders() {
var accessToken = sessionStorage["accessToken"] || localStorage["accessToken"];
if (accessToken) {
return { "Authorization": "Bearer " + accessToken };
}
return {};
}