1

有没有办法在 Basic Auth 属性后面控制 SwashBuckle 文档页面?所以只有拥有正确用户名和密码的人才能看到文档页面。

斜扣配置有

GlobalConfiguration.Configuration.EnableSwagger

.EnableSwaggerUi

但它创建了自己的 MessageHandler,因此我无法附加我的基本身份验证属性,该属性实现为ActionFilterAttribute.

我也不希望将基本身份验证应用于整个站点,而只是大摇大摆的端点

4

2 回答 2

4

如果我理解正确,那么您的情况可能与此(图像)和此(图像)类似。这是我所做和工作的:

 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。

于 2015-05-17T13:23:53.850 回答
0

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

重复这个问题:如何通过身份验证限制 swagger ui 页面,无论您选择哪种方式,都需要登录等。

答案:Web.config 位置授权

将以下位置添加到您的 web.config(如果有不同的基本路径设置,请更改招摇)

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

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

以上允许具有“api”角色的用户并限制其他所有人。

回退到授权模型来处理被拒绝时的处理方式。在我的情况下,用户重定向到登录页面。

于 2016-08-11T14:47:12.533 回答