Swagger UI - Oauth密码流,检索并向授权请求添加令牌

时间:2017-12-26 08:47:38

标签: c# asp.net-web-api oauth swagger swagger-ui

我刚刚开始在MVC中使用Swagger UI进行ASP.Net API Web项目。 除了身份验证之外,我理解的大多数部分都是正确的。

我正在使用OAuth ASP.Net Identity。以下是我的设置:

SwaggerConfig.cs

         c.OAuth2("oauth2")
                        .Description("OAuth2 Implicit Grant")
                        .Flow("password")
                        .AuthorizationUrl("/api/Account/ExternalLogin")
                        .TokenUrl("/Token")
                        .Scopes(scopes =>
                        {
                            scopes.Add("values:read", "Read access to protected resources");
                            scopes.Add("values:write", "Write access to protected resources");
                        });

         c.OperationFilter<AssignOAuth2SecurityRequirements>();

AssignOAuth2SecurityRequirements.cs

internal class AssignOAuth2SecurityRequirements : IOperationFilter
    {
        public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
        {
            var authorizeAttributes = apiDescription.ActionDescriptor.GetCustomAttributes<AuthorizeAttribute>();

            if (!authorizeAttributes.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);

        }
    }

的index.html

<script>
window.onload = function() {

  // Build a system
  const ui = SwaggerUIBundle({
      url: "http://localhost:17527/swagger/docs/v1",
    dom_id: '#swagger-ui',
    deepLinking: true,
    presets: [
      SwaggerUIBundle.presets.apis,
      SwaggerUIStandalonePreset
    ],
    plugins: [
      SwaggerUIBundle.plugins.DownloadUrl
    ],
    layout: "StandaloneLayout"
  })

  window.ui = ui
}
</script>

从APP页面授权/令牌请求。

Successful authentication and I do get the access_token as well when I look in console

但是当我尝试访问值endpoint时,它会抛出错误。

enter image description here

,原因是请求缺少应该在标题中的承载令牌

我已经尝试了一些解决方案,但无法解决它。

提前致谢。

2 个答案:

答案 0 :(得分:1)

我最近也尝试了这个,你必须在方法级别放置[Authorize]属性,而不是在控制器级别,然后它将工作并在每个请求中发送Bearer令牌。

答案 1 :(得分:0)

您还可以像这样同时检查ActionDescriptor和ControllerDescriptor。这样会阻止您将Authorize属性放在所有控制器方法上。

 public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
 {
        var authorizeAttributes = apiDescription.ActionDescriptor.GetCustomAttributes<AuthorizeAttribute>().Any() 
                                         ? apiDescription.ActionDescriptor.GetCustomAttributes<AuthorizeAttribute>()
                                         : apiDescription.ActionDescriptor.ControllerDescriptor.GetCustomAttributes<AuthorizeAttribute>();

        if (!authorizeAttributes.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);
 }