我正在使用OWIN中间件构建ASP.NET WebApi SPA,并且需要解释OAuthAuthorizationServerOptions中的AuthorizeEndpointPath属性的作用。
文档说明
客户端应用程序将重定向用户代理以获得用户同意以颁发令牌的请求路径。必须以斜杠开头,例如“ / Authorize”。
当我尝试不使用Bearer令牌访问受保护的WebApi时,我的应用程序从不重定向到指定的路径(正如我期望的那样),而只是返回401。
最佳答案
不同的端点路径可与不同的OAuth流一起使用以进行令牌授予。TokenEndpointPath
=用于获取令牌,在客户端凭证授予流,资源所有者密码凭证授予流以及授权码授予流的末尾AuthorizeEndpointPath
=用于授权代码授予流程和隐式授予流程中的委托auth
调用这些端点中的任何一个都会导致您在OAuthAuthorizationServerProvider
的实现中执行各种方法-执行哪种方法取决于您调用的端点以及随请求发送的参数。您必须从客户端显式调用其中之一-您将永远不会重定向到其中任何一个。
在进一步讨论流和端点之前,我们先定义三件事:
授权服务器:我们正在调用以授权客户端或用户的东西。就您而言-您要为OAuth配置的WebApi Web服务。通常,这实际上是在为资源提供资源,但是资源服务器和授权服务器可以分开。
客户:代表自身或代表用户向授权服务器发出请求的事物。可以是移动应用程序,SPA,Web应用程序,也可以是没有实际用户的其他应用程序。
用户:某些客户端应用程序的用户
令牌端点路径
客户凭证授予流程
我们让客户端直接进行身份验证-我们不要求用户在任何地方输入用户名和密码。这可能是因为客户端没有用户,或者当我们调用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
客户端使用密码的Grant_type向您在
TokenEndpointPath
中指定的终结点发出请求,这将导致在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章。