我正在使用OWIN中间件构建ASP.NET WebApi SPA,并且需要解释AuthorizeEndpointPath属性在OAuthAuthorizationServerOptions中的作用.
文件说明
客户端应用程序将重定向用户代理以获得用户同意发出令牌的请求路径.必须以前导斜杠开头,例如"/ Authorize".
当我尝试在没有Bearer令牌的情况下访问受保护的WebApi时,我的应用程序永远不会重定向到指定的路径(正如我所期望的那样),而只是返回401.
谢谢.
不同的端点路径用于不同的OAuth流以进行令牌授权.
TokenEndpointPath
=用于获取令牌,在客户端凭据授权流程中,资源所有者密码凭据授予流程,以及在授权代码授权流程结束时
AuthorizeEndpointPath
=用于授权代码授权流程和隐式授权流程中的委托身份验证
调用这些端点中的任何一个将导致在您的实现中执行各种方法OAuthAuthorizationServerProvider
- 执行哪些方法取决于您调用的端点以及您随请求发送的参数.你必须从你的客户端明确地调用其中一个 - 你永远不会被重定向到他们中的任何一个.
在讨论流程和端点之前,首先要定义三件事:
授权服务器:我们正在调用以授权客户端或用户的东西.在您的情况下 - 您为OAuth配置的WebApi Web服务.实际上,这也是实际提供资源的同一事情,但资源服务器和授权服务器可以拆分.
客户端:代表自己或代表用户向授权服务器发出请求的事物.可以是移动应用,SPA,网络应用,也可以是其他没有实际用户的应用.
用户:某个客户端应用程序的用户
我们让客户端直接进行身份验证 - 我们不是要求用户在任何地方输入用户名和密码.这可能是因为客户端没有用户,或者我们在调用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
(已验证客户端ID ValidateClientAuthentication
)为您设置有关客户端的一些声明.
这是用户将其详细信息直接输入客户端,客户端将这些详细信息直接发送到授权服务器.因此客户端会看到用户的凭据.
您可以在客户端使用以下请求调用它:
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
带有该代码的代码.
有关更多信息,请查看此MSDN页面,以及使用ASP.NET设计Evolvable Web API的第16章.