所以我正在使用Framework NOT Core构建Web API应用程序。我有一个用户授权,其中包括登录/注销/注册用户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端点?
不久前,我找到了解决自己问题的方法。我没有时间提前发布答案。随便
首先,我认为问题出在RouteConfig.cs,但似乎标准ApplicationOauthProvider.cs已准备好[[NOT进行授权授予,但已进行密码授予。因此,要使用multiple Grant-Types或Flow,最好的做法是创建自定义启动选项。
就我而言,我添加了以下内容:
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授权服务器上有一个很棒的文档页面。