首页 > 解决方案 > “错误:” “Unsupported_grant_type” 使用 OAuth 2.0,Owin。密码授予和授权授予

问题描述

我正在使用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 的那一刻,我看到“错误:”“Unsopported_grant_type”消息。

启动.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 端点?

标签: c#asp.net-web-apioauth-2.0authorizationowin

解决方案


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

首先,我认为问题出在 RouteConfig.cs 中,但标准ApplicationOauthProvider.cs似乎还没有准备好授权授权,而是准备密码授权。因此,要使用多个 Grant-Types或 Flow(s),最佳实践是创建自定义 Startup Options

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

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)'

ETC....

Microsoft 有一个很棒的文档页面,专门用于 Owin Oauth2 授权服务器。

Microsoft Owin Oauth2 授权服务器


推荐阅读