“错误:”“ Unsupported_grant_type”使用Owin 2.0,Owin。密码授予和授权授予

时间:2020-05-21 15:33:54

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

我正在使用框架 NOT Core构建Web API应用程序。我有一个用户授权,它是使用 Owin OAuth2 Password Grant_Type 的登录/注销/注册用户 Password Grant_Type

要访问NopCommerce受保护的资源,我必须使用OAuth2授权我的应用程序,授权Grant_Type获得令牌。 [在此处输入链接说明] [1]

问题是当我使用授权授予调用 / Token 端点时。在NopCommerce API将用户重定向到回调URL的那一刻,我看到“错误:”“ Unsopported_grant_type” 消息。

Startup.Auth.cs

// Configure the application for OAuth based flow
            PublicClientId = "self";
            OAuthOptions = new OAuthAuthorizationServerOptions
            {
                TokenEndpointPath = new PathString("/Token"),
                Provider = new ApplicationOAuthProvider(PublicClientId),
                AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
                ApplicationCanDisplayErrors = true,
                // In production mode set AllowInsecureHttp = false
                AllowInsecureHttp = true
            };

以及 Owin 随附的标准 ApplicationOauthProvider.cs

如何使用OAuth2 授权Grant_Type 使用上述/ Token端点?

1 个答案:

答案 0 :(得分:0)

不久前,我找到了解决自己问题的方法。我没有时间提前发布答案。随便

首先,我认为问题出在RouteConfig.cs中,但标准 ApplicationOauthProvider.cs 似乎已准备好进行授权授予,但可以进行密码授予。因此,要使用多种授权类型或流程,最佳做法是创建自定义启动选项

在我的情况下,我添加了以下内容:

NopOAuthOptions = new OAuthAuthorizationServerOptions
            {
                AuthorizeEndpointPath = new PathString("/NopAuthorize"),
                TokenEndpointPath = new PathString("/NopToken"),
                Provider = new NopOAuthProvider(),
                AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(10),
                ApplicationCanDisplayErrors = true,
                //true only in development
                AllowInsecureHttp = true,
            };

            app.UseOAuthAuthorizationServer(NopOAuthOptions);

然后我创建了这样的自定义提供程序:

public override Task MatchEndpoint(OAuthMatchEndpointContext context)
        {
            var endpointPath = new PathString("/NopAuthorize");

            if (context.Options.TokenEndpointPath == endpointPath)
            {
                context.MatchesAuthorizeEndpoint();
                Trace.WriteLine(context.OwinContext.Request.QueryString);
            }

            return base.MatchEndpoint(context);
        }

为了安全起见,最好也进行配置:

public override Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context)

 public override Task ValidateAuthorizeRequest(OAuthValidateAuthorizeRequestContext context)'

等等...

Microsoft在Owin Oauth2授权服务器上有一个很棒的文档页面。

Microsoft Owin Oauth2 Authorization Server