由Basic Auth控制的.NET MVC Swashbuckle

时间:2015-05-15 01:23:03

标签: asp.net-mvc swagger swagger-ui swashbuckle

有没有办法在Basic Auth属性后面输入SwashBuckle文档页面?因此,只有拥有正确用户名和密码的用户才能看到文档页面。

swashbuckle配置了

GlobalConfiguration.Configuration.EnableSwagger

.EnableSwaggerUi

但它会创建自己的MessageHandler,因此我无法附加我的Basic Auth属性,该属性以ActionFilterAttribute的形式实现。

我也不希望将基本身份验证应用于整个网站,只需将swagger端点

2 个答案:

答案 0 :(得分:4)

如果我说得对,那么你的情况可能与此类似(image)(image)。 这就是我所做的事情&工作:

 public class AddAuthorizationHeaderParameterOperationFilter: IOperationFilter
{
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
    {
        var filterPipeline = apiDescription.ActionDescriptor.GetFilterPipeline();
        var isAuthorized = filterPipeline.Select(filterInfo => filterInfo.Instance).Any(filter => filter is IAuthorizationFilter);

        var allowAnonymous = apiDescription.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any();
        var basicAuthenticator = apiDescription.ActionDescriptor.GetCustomAttributes<MyBasicAuthenticator>().Any();            
        
        //because the attribute might be at controller or action method            
        var myTokenAuthenticator = apiDescription.GetControllerAndActionAttributes<MyTokenAuthenticator>().Any(); 
		
        //actionname: certain controllers
        if (isAuthorized != null)
        {
            if (operation != null)
            {
                if (operation.parameters == null)
                {
                    operation.parameters = new List<Parameter>();
                }
                if (myTokenAuthenticator)
                {                       
                    operation.parameters.Add(new Parameter()
                    {
                        name = "Authorization",
                        @in = "header",
                        description = "Id obtained from the service method authenticate. Ex: MyToken ID",
                        required = true,
                        type = "string"                            
                    });
                }
                if (basicAuthenticator)
                {
                    operation.parameters.Add(new Parameter()
                    {
                        name = "Authorization",
                        @in = "header",
                        type = "string",                              
                        description = "basic http authentication. Ex: Basic (Email:Password).ToBase64",
                        @required = true
                    });                        
                }
            }
        }
    }
}

类似问题: swashbuckle q.

答案 1 :(得分:0)

在尝试解决这个问题时,并没有找到答案,找到了想要的东西。

重复一个问题:如何使用您选择的身份验证限制swagger ui页面,需要登录等。

答案:Web.config位置授权

将以下位置添加到您的web.config中(如果设置了不同的基本路径,则更改swagger)

<configuration>
  <location path="swagger">
    <system.web>
      <authorization>
        <allow roles="api"/> 

        <deny users="*"/> 
      </authorization>
    </system.web>
  </location>
</configuration>
上面的

允许用户具有'api'角色并限制其他人。

回退到授权模型,拒绝时该做什么。在我的情况下,用户被重定向到登录页面。