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

Posted

技术标签:

【中文标题】“错误:” “Unsupported_grant_type” 使用 OAuth 2.0,Owin。密码授予和授权授予【英文标题】:"Error:" "Unsupported_grant_type" Using OAuth 2.0, Owin. Password Grant and Authorization Grant 【发布时间】:2020-09-08 07:07:46 【问题描述】:

我正在使用 Framework NOT Core 构建一个 Web API 应用程序。我有一个用户授权,它是 Login/Logout/Register User Password Grant_Type,使用 OwinOAuth2 Password Grant_Type .

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

问题是当我使用 Authorization Grant 调用 /Token 端点时。在 NopCommerce API 将用户重定向到回调 url 的那一刻,我看到 "Error:" "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 Authorization Grant_Type 使用上述 /Token 端点?

【问题讨论】:

您是否在身份验证服务中添加了授权类型? 不,正如您在上面的代码中看到的那样,我没有。 Wich 负责授权。但是我在哪里添加 garant 类型?在 GetAuthorizationUrl 方法中? 您正在使用资源所有者密码流程,请阅读此处的文档docs.identityserver.io/en/aspnetcore1/quickstarts/… 我现在已经用正确的问题描述和一个坚定的问题编辑了我的问题。 【参考方案1】:

所以不久前我找到了解决我自己问题的方法。我没有时间早点发布我的答案。反正。

首先我认为问题出在 RouteConfig.cs 中,但似乎标准 ApplicationOauthProvider.cs准备好进行授权授予,但已准备好密码授予。因此,要使用多个 Grant-Types 或 Flow(s),最佳做法是创建 自定义启动选项

在我的案例中,我添加了以下内容:

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

【讨论】:

以上是关于“错误:” “Unsupported_grant_type” 使用 OAuth 2.0,Owin。密码授予和授权授予的主要内容,如果未能解决你的问题,请参考以下文章

Informix 错误:发生了语法错误。错误代码:-201

我收到一个错误:“MetaMask - RPC 错误:错误:错误:[ethjs-rpc] rpc 错误与有效负载”

错误精灵错误跟踪器错误

网页打开显示错误500是啥意思

PHP错误处理

PHP的错误处理