如何获取用户的UserName来调用API?

时间:2013-12-31 21:27:45

标签: authentication identity single-page-application asp.net-web-api2

技术: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+


2 个答案:

答案 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 {};
    }