我正在尝试为使用OAuth的Web API设置swagger文档(使用OWIN中间件' UseOAuthAuthorizationServer')但遇到问题。
我已完成OAuth swagger配置,如下所示:
包含范围的常规OAuth配置:
c.OAuth2("oauth2")
.Description("OAuth2 Implicit Grant")
.Flow("implicit")
.AuthorizationUrl(ConfigurationManager.AppSettings[Constants.AuthorizationHostUrl])
.TokenUrl(ConfigurationManager.AppSettings[Constants.TokenUrl])
.Scopes(scopes =>
{
scopes.Add("Admin", "Admin permission required");
});
为所选API启用OAuth:
c.OperationFilter<AssignOAuth2SecurityRequirements>();
Swagger UI配置:
c.EnableOAuth2Support("MyPortal", "test-realm", "Swagger UI");
使用上面的代码,我可以在适当的端点方法上查看切换按钮。当我单击按钮时,它也会根据上面的配置显示范围。
有一次,我选择范围并点击授权按钮,我的OAuth服务器无法进行身份验证,因为它首先验证了客户端,并且看起来swagger没有传递client-id值。在我的OAuth服务器中检测到问题,即
OAuthAuthorizationServerProvider::ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
方法在以下行失败:
if (!context.TryGetBasicCredentials(out suppliedClientId, out suppliedClientSecret))
{
//if resource provider taking client credentials with FORMS authentication
context.TryGetFormCredentials(out suppliedClientId, out suppliedClientSecret);
}
if (context.ClientId == null)
{
context.SetError("invalid_clientId", "client_Id is not set");
return;
}
OAuthValidateClientAuthenticationContext参数没有关于客户端的信息。
在调试时,在上面的方法中,我已经逃脱了这些故障点并成功验证了客户端。
但是,我仍然得到以下错误,我不知道:
unsupported_grant_type
有人可以帮助我解决这些问题吗?
答案 0 :(得分:0)
我无法看到您传递客户端ID的位置。以下内容适用于我:
尝试:
c.EnableOAuth2Support("your Client Id here", "test-realm", "Swagger UI");
而不是
c.EnableOAuth2Support("MyPortal", "test-realm", "Swagger UI");
AssignOAuth2SecurityRequirements操作过滤器应如下所示 - 您需要将您的客户端ID放在我指示的位置:
public class AssignOAuth2SecurityRequirements : IOperationFilter
{
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
var actFilters = apiDescription.ActionDescriptor.GetFilterPipeline();
var allowsAnonymous = actFilters.Select(f => f.Instance).OfType<OverrideAuthorizationAttribute>().Any();
if (allowsAnonymous)
return;
if (operation.security == null)
operation.security = new List<IDictionary<string, IEnumerable<string>>>();
var oAuthRequirements = new Dictionary<string, IEnumerable<string>>
{
{"oauth2", new List<string> {"your client id here"}}
};
operation.security.Add(oAuthRequirements);
}
}