我正在使用OWIN中间件构建ASP.NET WebApi SPA,并且需要解释OAuthAuthorizationServerOptions中 AuthorizeEndpointPath 属性的作用。
文档说明
客户端应用程序将重定向用户代理以获得用户同意发出令牌的请求路径。必须以前导斜杠开头,例如“/ Authorize”。
当我尝试在没有Bearer令牌的情况下访问受保护的WebApi时,我的应用程序永远不会重定向到指定的路径(正如我所期望的那样),但只返回401。
感谢。
答案 0 :(得分:20)
不同的端点路径用于不同的OAuth流以进行令牌授权。
TokenEndpointPath
=用于获取令牌,客户端凭据授予流,资源所有者密码凭据授予流,以及< em>授权代码授予流程AuthorizeEndpointPath
=用于授权代码授予流程中的委托身份验证和隐式授权流程调用这些端点中的任何一个将导致在OAuthAuthorizationServerProvider
的实现中执行各种方法 - 执行哪些方法取决于您调用的端点以及您随请求发送的参数。你必须从你的客户端明确地调用其中一个 - 你永远不会被重定向到其中任何一个。
在讨论流程和端点之前,首先要先定义三件事:
我们让客户端直接进行身份验证 - 我们不是要求用户在任何地方输入用户名和密码。这可能是因为客户端没有用户,或者我们在调用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
方法。
假设用户凭据有效,则授予访问权限,您创建一个标识,该标识将具有特定于该用户的某些声明,并返回一个令牌,客户端可以随后发送给授权服务器以再次将此标识拉出以后的要求。
对于授权代码授予流和隐式授权流,我们对用户是谁感兴趣,但我们不希望用户直接将凭据输入客户端。在这种情况下,客户端调用授权服务器,并且授权服务器使用户以某种方式代表客户端进行身份验证。在这种情况下,客户端必须通过其客户端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
正在使用TokenEndpointPath
或AuthorizeEndpointPath
来匹配当前请求URI并查看它是否是身份验证尝试。如果它与AuthorizeEndpointPath
匹配,则会使用AuthorizeEndpointRequest
中的参数创建新的this.Request.Query
,其中应包含client_id
和redirect_uri
等值。
所以我的猜测是AuthorizeEndpointPath
的请求看起来应该是
/api/Account/ExternalLogin?client_id=<your_server_id>&redirect_uri=<absolute_path_to_external_authorization_endpoint>
并且显然会使用第三方服务器进行身份验证。
同样,这是我可以从源代码中找到的。