Owin OAuth2.0 PasswordGrant流程

时间:2017-12-22 01:51:58

标签: c# asp.net-web-api oauth-2.0 owin

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

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

    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

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

2 个答案:

答案 0 :(得分:0)

你需要"描述"验证GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext)方法体中凭证的方法,而不是调用基本方法。 当您调用context.Validated(ClaimsIdentity)方法时 - 您会收到响铃中的持有人令牌。

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

或您可以看到示例here

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

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

答案 1 :(得分:0)

好吧,所以当我问这个问题时,我错误地解释了呼叫的流程。

我在考虑使用密码授权时要调用的第一个函数是GrantResourceOwnerCredentialsOAuth Spec Doc Password Grant.实际上,它始终会调用ValidateClientAuthentication,然后调用GrantResourceOwnerCredentials

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