bit*_*yte 11 asp.net-web-api owin asp.net-identity
我正在使用OWIN中间件构建ASP.NET WebApi SPA,并且需要解释AuthorizeEndpointPath属性在OAuthAuthorizationServerOptions中的作用.
文件说明
客户端应用程序将重定向用户代理以获得用户同意发出令牌的请求路径.必须以前导斜杠开头,例如"/ Authorize".
当我尝试在没有Bearer令牌的情况下访问受保护的WebApi时,我的应用程序永远不会重定向到指定的路径(正如我所期望的那样),而只是返回401.
谢谢.
ngm*_*ngm 21
不同的端点路径用于不同的OAuth流以进行令牌授权.
TokenEndpointPath=用于获取令牌,在客户端凭据授权流程中,资源所有者密码凭据授予流程,以及在授权代码授权流程结束时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
Run Code Online (Sandbox Code Playgroud)
将调用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
Run Code Online (Sandbox Code Playgroud)
客户端向您指定的端点发出请求 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
Run Code Online (Sandbox Code Playgroud)
该response_type参数确定我们是使用隐式代码流还是授权代码流.在AuthorizationEndpointResponse基于这一点,我们可以返回令牌或代码.如果我们返回一个代码,那么客户端必须调用TokenEndpointPath带有该代码的代码.
有关更多信息,请查看此MSDN页面,以及使用ASP.NET设计Evolvable Web API的第16章.
我最终来到这里寻找相同的答案。由于我没有找到任何东西,我开始使用反编译器进行挖掘。
事实证明,OAuthAuthorizationServerMiddleware正在使用TokenEndpointPath或AuthorizeEndpointPath来匹配当前请求 URI,并查看它是否是一次身份验证尝试。在它匹配的情况下,它使用其中的参数AuthorizeEndpointPath创建一个新的,其中应该包含诸如和 之类的值。AuthorizeEndpointRequestthis.Request.Queryclient_idredirect_uri
所以我的猜测是,对 的请求AuthorizeEndpointPath应该是这样的
/api/Account/ExternalLogin?client_id=<your_server_id>&redirect_uri=<absolute_path_to_external_authorization_endpoint>
Run Code Online (Sandbox Code Playgroud)
显然,您可以使用第三方服务器进行身份验证。
同样,这是我可以从源代码中弄清楚的。
| 归档时间: |
|
| 查看次数: |
7570 次 |
| 最近记录: |