使用Web Api(v5.2.3)时使用swagger(Swashbuckle和Swashbuckle.Core版本均为5.3.2)的clientId为null

时间:2016-06-11 13:11:32

标签: api oauth swagger

我正在尝试为使用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

有人可以帮助我解决这些问题吗?

1 个答案:

答案 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);
      }
    }