【问题标题】:"Error:" "Unsupported_grant_type" Using OAuth 2.0, Owin. Password Grant and Authorization Grant“错误:” “Unsupported_grant_type” 使用 OAuth 2.0,Owin。密码授予和授权授予
【发布时间】: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/…
  • 我现在已经用正确的问题描述和一个坚定的问题编辑了我的问题。

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


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2019-07-07
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    相关资源
    最近更新 更多