0

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


4

2 回答 2

0

尝试从 HttpRequestMessage 对象而不是从当前线程获取标识:

    public IEnumerable<string> Get()
    {
        return new string[]  
        { 
            this.Request.GetRequestContext().Principal.Identity.Name
        };
    }

Web Api 2 中不再提供静态方法 HttpContext。

于 2013-12-31T21:30:55.173 回答
0

在 javascript 方面,在 webapi 调用中,您需要确保在 app.datamodel.js 中调用他们的 getSecurityHeaders 函数,如下所示(当然是在他们登录之后):

    var getabc = function () {
        return $.ajax("api/abc", {
            type: "GET",
            headers: getSecurityHeaders()
        });
    };

如果您不调用他们的 getSecurityHeaders() 函数,则 Identity 将为空。

为了完整起见,这是该功能:

function getSecurityHeaders() {
        var accessToken = sessionStorage["accessToken"] || localStorage["accessToken"];

        if (accessToken) {
            return { "Authorization": "Bearer " + accessToken };
        }

        return {};
    }
于 2014-01-05T02:10:04.423 回答