我正在使用框架 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端点?
答案 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授权服务器上有一个很棒的文档页面。