我使用IdentityServer3通过客户端凭据授予来保护Web API。对于文档,我正在使用Swashbuckle,但无法弄清楚如何在SwaggerConfig中为客户端凭据(应用程序)流启用Oauth2。任何帮助,将不胜感激!
最佳答案
我能够做到这一点。大部分答案都可以在here中找到。
我必须更改一些部分才能使client_credential许可起作用。
第一部分是在EnableSwagger和EnableSwaggerUi调用中:
config.EnableSwagger(c =>
{
c.SingleApiVersion("v1", "sample api");
c.OAuth2("oauth2")
.Description("client credentials grant flow")
.Flow("application")
.Scopes(scopes => scopes.Add("sampleapi", "try out the sample api"))
.TokenUrl("http://authuri/token");
c.OperationFilter<AssignOAuth2SecurityRequirements>();
}).EnableSwaggerUi(c =>
{
c.EnableOAuth2Support("sampleapi", "samplerealm", "Swagger UI");
});
这里的重要更改是
.Flow("application")
我也使用了.TokenUrl
调用而不是.AuthorizationUrl
这仅取决于您设置的特定授权方案。我还使用了稍微不同的
AssignOAuth2SecurityRequirements
类public class AssignOAuth2SecurityRequirements : IOperationFilter
{
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
var authorized = apiDescription.ActionDescriptor.GetCustomAttributes<AuthorizeAttribute>();
if (!authorized.Any()) return;
if (operation.security == null)
operation.security = new List<IDictionary<string, IEnumerable<string>>>();
var oAuthRequirements = new Dictionary<string, IEnumerable<string>>
{
{"oauth2", Enumerable.Empty<string>()}
};
operation.security.Add(oAuthRequirements);
}
}
这应该足以显示身份验证开关。对我来说,另一个问题是设置了默认的身份验证对话框,因此用户只需要选择一个范围,然后单击授权即可。就我而言,由于我设置了身份验证的方式,因此无法正常工作。我必须用swagger-oauth.js脚本重新编写对话框,然后将其注入SwaggerUI。