什么是AuthorizeEndpointPath?

时间:2016-01-02 03:09:06

标签: asp.net-web-api asp.net-identity owin

我正在使用OWIN中间件构建ASP.NET WebApi SPA,并且需要解释OAuthAuthorizationServerOptions中 AuthorizeEndpointPath 属性的作用。

文档说明

  

客户端应用程序将重定向用户代理以获得用户同意发出令牌的请求路径。必须以前导斜杠开头,例如“/ Authorize”。

当我尝试在没有Bearer令牌的情况下访问受保护的WebApi时,我的应用程序永远不会重定向到指定的路径(正如我所期望的那样),但只返回401。

感谢。

2 个答案:

答案 0 :(得分:20)

不同的端点路径用于不同的OAuth流以进行令牌授权。

  • TokenEndpointPath =用于获取令牌,客户端凭据授予流,资源所有者密码凭据授予流,以及< em>授权代码授予流程
  • AuthorizeEndpointPath =用于授权代码授予流程中的委托身份验证和隐式授权流程

调用这些端点中的任何一个将导致在OAuthAuthorizationServerProvider的实现中执行各种方法 - 执行哪些方法取决于您调用的端点以及您随请求发送的参数。你必须从你的客户端明确地调用其中一个 - 你永远不会被重定向到其中任何一个。

在讨论流程和端点之前,首先要先定义三件事:

  • 授权服务器:我们正在调用以授权客户端或用户的东西。在您的情况下 - 您为OAuth配置的WebApi Web服务。很多时候这也是实际提供资源的事情,但资源服务器和授权服务器可以分开。
  • 客户端:代表自己或代表用户向授权服务器发出请求的内容。可以是移动应用,SPA,网络应用,也可以是其他没有实际用户的应用。
  • 用户:某个客户端应用程序的用户

TokenEndpointPath

客户端凭据授予流程

我们让客户端直接进行身份验证 - 我们不是要求用户在任何地方输入用户名和密码。这可能是因为客户端没有用户,或者我们在调用Web服务时并不关心用户是谁。

示例请求:

POST https://yourwebapi.com/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: yourwebapi.com

grant_type=client_credentials&
client_id=mega_app&
client_secret=1234hsdflkjh123

将调用GrantClientCredentials(已验证ValidateClientAuthentication中的客户端ID),以便您设置有关客户的一些声明。

资源所有者密码凭据流程

这是用户将其详细信息直接输入客户端,客户端将这些详细信息直接发送到授权服务器。所以客户端会看到用户的凭据

您可以通过以下请求在您的客户端中调用它:

POST https://yourwebapi.com/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: yourwebapi.com

grant_type=password&
username=bart&
password=b4rt

客户端向您在TokenEndpointPath中指定的端点发出请求,其grant_type为password,这将导致您在GrantResourceOwnerCredentials的实施中调用OAuthAuthorizationServerProvider方法。

假设用户凭据有效,则授予访问权限,您创建一个标识,该标识将具有特定于该用户的某些声明,并返回一个令牌,客户端可以随后发送给授权服务器以再次将此标识拉出以后的要求。

AuthorizeEndpointPath

对于授权代码授予流和隐式授权流,我们对用户是谁感兴趣,但我们不希望用户直接将凭据输入客户端。在这种情况下,客户端调用授权服务器,并且授权服务器使用户以某种方式代表客户端进行身份验证。在这种情况下,客户端必须通过其客户端ID和redirect_url以及其他一些位发送。

  GET  HTTP/1.1
  Host: https://yourwebapi.com/api/Account/ExternalLogin?
  client_id=mega_app&
  scope=user+repo&
  state=1234kjhsfdlkh123497&
  response_type=code&
  redirect_uri=https%3a%2f%2fyourwebapi.com%2fcallme

response_type参数确定我们是否使用隐式授权代码流程。在AuthorizationEndpointResponse基于此,我们可以返回令牌或代码。如果我们返回一个代码,那么客户端必须调用TokenEndpointPath,并为该代码提供一个令牌。

请查看this MSDN page了解详情,以及Designing Evolvable Web APIs with ASP.NET的第16章。

答案 1 :(得分:0)

我最终在这里寻找相同的答案。因为我没有找到任何我开始挖掘反编译器。

事实证明OAuthAuthorizationServerMiddleware正在使用TokenEndpointPathAuthorizeEndpointPath来匹配当前请求URI并查看它是否是身份验证尝试。如果它与AuthorizeEndpointPath匹配,则会使用AuthorizeEndpointRequest中的参数创建新的this.Request.Query,其中应包含client_idredirect_uri等值。

所以我的猜测是AuthorizeEndpointPath的请求看起来应该是

/api/Account/ExternalLogin?client_id=<your_server_id>&redirect_uri=<absolute_path_to_external_authorization_endpoint>

并且显然会使用第三方服务器进行身份验证。

同样,这是我可以从源代码中找到的。