我使用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。

07-24 15:31