【问题标题】:How can I create a stand alone .NET client which calls a web service secured with OAuth?如何创建一个独立的 .NET 客户端来调用受 OAuth 保护的 Web 服务?
【发布时间】:2018-09-12 17:40:32
【问题描述】:

我需要编写一个独立(命令行)程序来调用使用 OAuth 2 进行身份验证的 Web 服务。 Web 服务使用 IndentityServer4。我正在寻找一个可用于此的库和一些示例代码。

我是 OAuth 新手,所以不了解协议的所有细节,但通过提供这些参数,我能够使用邮递员获取令牌。我猜 Auth URL 是登录屏幕的地址。

Auth URL、Access Token URL、ClientID、Client Secret 和 Scope。

当我请求令牌时,Postman 会转到由实现 OAuth 的服务器实现的登录页面,我需要在其中输入单独的用户名和密码。

如果我的理解是正确的,为了让它工作,我们需要对服务器进行更改,以通过以某种方式向应用程序用户名传递密码来允许非交互式登录。

【问题讨论】:

  • 常见的 oauth 流程是为浏览器设计的,而不是客户端应用程序。查看客户端应用程序的 Jwt Bearer 和 webapi 流程。
  • @Tracer - 我们创建的后端旨在为前端 Web 应用程序提供服务,因此有一个登录页面是有意义的,但我们也希望有一个非交互式客户端用于测试目的。是否可以设计以交互方式和非交互方式工作的 OAuth 工作流程?如果可能,我们宁愿不引入第二种身份验证方法。

标签: asp.net asp.net-core oauth identityserver4


【解决方案1】:

IdentityModel nuget package 有客户端和助手来简化从 IdentityServer 请求(和使用)访问令牌。您可以在其github page 上找到有关该库的信息。在 IdentityServer4 快速入门中有一些很好的示例说明如何获取令牌并使用它们来调用 Web API:

Protecting an API using client credentials

Protecting an API using passwords

这是一个使用客户端凭据获取令牌然后使用令牌调用 api 的示例:

// discover the token endpoint
var disco = await DiscoveryClient.GetAsync("http://identityserver");

// request an access token
var tokenClient = new TokenClient(disco.TokenEndpoint, "client", "secret");
var tokenResponse = await tokenClient.RequestClientCredentialsAsync("your-api");

// call the api
var client = new HttpClient();
client.SetBearerToken(tokenResponse.AccessToken);

var response = await client.GetAsync("http://yourapi/some-resource");

【讨论】:

  • 这看起来很有希望。目前我们需要通过服务器实现的登录屏幕屏幕(修改了我的问题)。我认为我们需要在服务器端配置身份服务器以允许非交互式身份验证,您知道我们将如何使用 IdentityModel 进行身份验证吗?
  • 我的错误 - 我看错了你的问题。我错过了有关 OAuth 的部分,并假设您正在使用 Jwt Bearer 中间件来验证您的 API,因为这是典型的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多