2016-06-11 192 views
1

我试图为使用OAuth的Web API设置swagger文档(使用OWIN中间件的UseOAuthAuthorizationServer ')但遇到问题。使用Swagger(Swashbuckle和Swashbuckle.Core版本为5.3.2)时,clientId为null使用Web Api(v5.2.3)

我做的OAuth招摇配置如下:

一般的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"); 
        }); 

启用OAuth使用所选的API:

  c.OperationFilter<AssignOAuth2SecurityRequirements>(); 

扬鞭UI配置:

  c.EnableOAuth2Support("MyPortal", "test-realm", "Swagger UI"); 

使用上面的代码,我可以查看适当的终点方法的切换按钮。当我点击按钮时,它也会根据上述配置显示范围。

有一次,我选择作用域并点击授权按钮,我的OAuth服务器无法进行身份验证,因为它首先验证了客户端,看起来很大兴趣不在传递客户端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

我不能看到你通过客户端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); 
     } 
    } 
+0

感谢您的回复。我遵循这篇文章[链接](http://www.wmpratt.com/part-ii-swagger-and-asp-net-web-api-enabling-oauth2/),并根据该文章,我已将范围设置为我的角色名称。在你回复之后,我已经将字典值硬编码到我的客户端-id(仅用于测试目的),但仍然将客户端ID设置为空。 –

相关问题