【问题标题】:How to get the UserName of the user making the call to the API?如何获取调用 API 的用户的用户名?
【发布时间】:2013-12-31 21:27:45
【问题描述】:

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


【问题讨论】:

  • 您在 Startup.Auth.cs 类中配置了什么类型的身份验证?

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


【解决方案1】:

在 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 {};
    }

【讨论】:

  • 嗨,Jason,这听起来和我要找的完全一样。我将对其进行测试并检查更新。谢谢!
【解决方案2】:

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

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

静态方法 HttpContext 在 Web Api 2 中不再可用。

【讨论】:

  • grennis,感谢您的快速回复。一个小例子将不胜感激。
  • 不走运。还是空的。
  • 另外,我做了一些测试,发现如下: 1. 成功注册\登录后,用户得到一个令牌 2. 由于某种原因,后续请求没有将此令牌传递回服务器令牌不应该是用户请求的一部分吗?
  • 是的,它应该返回一个带有标识符的 cookie,asp.net 使用该标识符将客户端与用户相关联。
  • 到目前为止没有运气。 SPA 模板使用带有不记名令牌和 OWIN 的 OAuth,这在 Web API 世界中更正确(而不是使用 cookie)。感谢@grennis 的跟进。
猜你喜欢
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
相关资源
最近更新 更多