【问题标题】:How to pass authorization token to GET method to access authorized resource?如何将授权令牌传递给 GET 方法以访问授权资源?
【发布时间】:2017-06-27 11:51:21
【问题描述】:

我是基于令牌的身份验证的新手。参考以下链接,我正在尝试了解基于令牌的身份验证。

如果用户凭据有效,我将获得所需的令牌。

[AcceptVerbs("POST")]
    [HttpPost]
    public string Post([FromBody]User user)
    {
        if(user.Username == "hello" && user.Password == "123")
        {
            var accessTokenResponse = GenerateLocalAccessTokenResponse(user.Username);

            return accessTokenResponse.ToString();
        }
        else
        {
            return "User invalid";
        }
    }

生成的令牌

TWC1Q2rrenZC2p78KPnS4JblcepCg6q3XuxqBQIh7L003npbb6hlBAOYGRN03OvY_O55GWFkZp7UfCmhCgH9Z4rBsjvIrp8gyCp4HmxpP4axVKk10NM9fiG2ctgZWeSbw1jNOor42Wk3yMufbs4xP0RlNuvdpLtBLir52g9rPF053kiJtYryNGzPsbibXHRrNoy0wOR2384uLAJ5pNE9s1DwYpdPKB9uOLSAGhDQOVU, P>

现在当我尝试访问受保护的资源时

    [Authorize]
    [HttpGet]
    // GET api/orders/5
    public string Get()
    {
        return "This is a secure resource";
    }

我收到“拒绝访问错误”。

如何使用令牌访问此类资源。

非常感谢任何帮助/建议。 谢谢。

【问题讨论】:

标签: c# asp.net asp.net-web-api oauth http-token-authentication


【解决方案1】:

通常您不会在控制器中将令牌端点实现为 POST 方法,而是为它创建一个单独的类 (SimpleAuthorizationServerProvide),如上述教程所示。 如果一切设置正确,您必须在您的 http 请求中添加一个 Authorization 标头

Authorization: Bearer TWC1Q2rrenZC2p78KP...

并获得状态码 200(OK) 的回复

要获取令牌,请向您的令牌端点发送请求(例如使用工具fiddler) 例如如果您的服务在 localhost 的 52180 端口上运行,它看起来像这样:

POST http://localhost:52180/token 

grant_type=password&username=admin&password=123&client_id=abc

grant_type 部分是请求正文。 当您发布上述请求时,您将到达令牌端点。正如 Taiseer 在教程的第 12 步中所写。

当您在GrantResourceOwnerCredentials 放置断点时,应在您发送上述请求后立即到达。

通常的流程是: - 客户端向http://localhost:52180/token 请求令牌

  • 服务器在 GrantResourceOwnerCredentials 中验证用户凭据并颁发令牌

  • 客户端从令牌响应中读取 access_token

  • 客户端将包含 access_token 的授权标头添加到请求中

    http://localhost:52180/api/orders
    
    Authorization: Bearer TWC1Q2rrenZC2p78KP...
    
  • 服务器读取授权标头并授予访问权限(如果令牌有效)

  • 服务器处理请求,例如GET请求

  • 客户端收到状态 200 和所需数据

上面显示的 api 控制器看起来没问题 [Authorize] 属性是您在控制器中所需要的。这会将 AuthorizationFilter 添加到 http 请求管道,当客户端将上述 Authoriztion 标头添加到请求时,它会为您处理授权。

【讨论】:

  • 同意。但是如何将授权令牌添加到获取订单。请建议
  • 我交叉检查了一切似乎都匹配。
  • 你说,一切都如教程中的那样,但它不起作用?您将令牌请求发送到哪里?应该是 TokenEndpointPath 中配置的路径,例如。 http://localhost:/token。不要公开字符串 Post([FromBody]User user),你不需要那个。
  • 在 GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 处下断点,这是发送令牌请求时应该命中的方法
  • 我这里已经添加了相关的code-sn-ps。 1)codepaste.net/7uy6po2)codepaste.net/8otsfg3)codepaste.net/n286c7
猜你喜欢
  • 2017-08-28
  • 2017-10-18
  • 2020-01-03
  • 2018-10-11
  • 1970-01-01
  • 2019-09-14
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多