“错误:” “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,使用 Owin 和 OAuth2 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。密码授予和授权授予的主要内容,如果未能解决你的问题,请参考以下文章