Owin OAuth 2.0密码授权流程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Owin OAuth 2.0密码授权流程相关的知识,希望对你有一定的参考价值。

问题:我在这里遗漏了什么或者误解了实际应该调用哪些函数?

所以我通过创建一个使用Owin.OAuth实现OAuth2的测试Web Api项目开始简单。点击路由并进入提供程序是没有问题的,但这里是代码:启动类:

    public void Configuration(IAppBuilder app)
    {
        var config = GlobalConfiguration.Configuration;

        app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/Token"),
            Provider = new OAuthProvider(),
            AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(60),
            AllowInsecureHttp = true
        });

        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());           

        WebApiConfig.Register(config);            
    }

而现在是一个准系统提供者类:

    public class OAuthProvider : OAuthAuthorizationServerProvider
    {

    public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
    {
        return base.ValidateClientAuthentication(context);
    }

    public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        return base.GrantResourceOwnerCredentials(context);
    }
}

我想使用密码授予https://tools.ietf.org/html/rfc6749#section-4.3.2。现在根据OAuthAuthorizationServerProvider文档,在以下情况下调用GrantResourceOwnerCredentials函数:

当对Token端点的请求以“grant_type”“password”到达时调用。当用户直接向客户端应用程序的用户界面提供名称和密码凭证,并且客户端应用程序使用这些凭据获取“access_token”和可选的“refresh_token”时,就会发生这种情况。

但是当我点击路线时,它总是进入ValidateClientAuthentication函数。

邮差有效载荷:

POST /Token HTTP/1.1
Host: localhost:57507
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
grant_type=password&username=test&password=test123

也尝试通过Postman使用BasicAuth:

POST /Token HTTP/1.1
Host: localhost:57507
Content-Type: application/x-www-form-urlencoded
Authorization: Basic dGVzdDp0ZXN0MTIz
grant_type=password

我在这里遗漏了什么或者误解了它是如何工作的吗?

答案

您需要“描述”在GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext)方法体中验证凭据的方法,而不是调用base方法。当你调用context.Validated(ClaimsIdentity)方法时 - 你会得到响应的持有者令牌。

有一个很好的例子 - see first code block in question

或者您可以看到示例here

ValidateClientAuthentication仅验证您的凭据“grant_type = password&username = test&password = test123”

否则,您的代码看起来没问题。

另一答案

好吧,所以当我问这个问题时,我正在正确地解释呼叫的流程。

我在想,当使用密码授权时,要调用的第一个函数是GrantResourceOwnerCredentialsOAuth Spec Doc Password Grant.实际上它总是打电话给ValidateClientAuthentication然后GrantResourceOwnerCredentials

所以这只是我的一个误解。此示例代码正在运行。

以上是关于Owin OAuth 2.0密码授权流程的主要内容,如果未能解决你的问题,请参考以下文章

OAuth 2.0 代码授权流程

spring-security-oauth2.0 SSO大体流程图

Owin.OAuth

OAuth 2.0:在授权代码流程中,谁最终将访问令牌交给我的 Web 浏览器?

Spring Security OAuth 2.0 - 授权代码授予始终需要客户端密码

OWIN OAuth 2.0 Authorization Server