Azure Application Insights - 使用基本身份验证进行可用性测试?

时间:2017-07-25 11:27:54

标签: azure azure-application-insights

我正在尝试在需要基本身份验证的端点上使用Azure Application Insights设置可用性测试(URL Ping测试)。看来这个标准的做法 Azure不接受https://username:password@myendpoint.com(错误消息表明网址格式错误,并且可能在开头时缺少https / http)。

除了使用多步骤Web测试或Azure功能之外,还有其他方法可以实现这一点,假设我想留在Azure生态系统中吗? :)

3 个答案:

答案 0 :(得分:2)

RFC 3986已弃用在URL中传递基本身份验证凭据(以下是RFC的摘录)

  

<强> 3.2.1。用户信息

     

userinfo子组件可能包含用户名,并且   可选地,关于如何获得的特定于方案的信息   授权访问资源。用户信息,如果   现在,接着是一个商业标志(&#34; @&#34;),用来界定它   来自主持人。

  userinfo    = *( unreserved / pct-encoded / sub-delims / ":" )
     

使用格式&#34; user:password&#34;不推荐使用userinfo字段。

替代方法是使用授权标头传递凭据。以下是Wikipedia (Basic Auth)关于如何构建此标头的代码段。

  

授权字段构造如下:[6]

     
      
  1. 用户名和密码与单个冒号组合在一起。 (:)
  2.   
  3. 结果字符串被编码为八位字节序列。[7]
  4.   
  5. 使用Base64的变体对结果字符串进行编码。[8]
  6.   
  7. 然后将授权方法和空格预先添加到编码的字符串中,用空格分隔(例如&#34; Basic&#34;)。
  8.         

    例如,如果浏览器使用 Aladdin 作为用户名并使用 OpenSesame 作为密码,然后字段的值是 Aladdin:OpenSesame base64-encoding ,或 QWxhZGRpbjpPcGVuU2VzYW1l 。然后Authorization标题将显示为:

    Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l
    

您可以在 Visual Studio Enterprise 中创建 Web测试文件,然后将其上传到应用洞察并使用它。请参阅此文档:https://docs.microsoft.com/en-us/azure/application-insights/app-insights-monitor-web-app-availability

  1. 在Visual Studio Enterprise中,您可以创建WebTest项目。
  2. 右键单击项目名称,然后选择添加请求enter image description here
  3. 现在右键点击该链接并选择添加标题enter image description here
  4. 您可以根据自己的要求添加标题。 enter image description here
  5. 当您查看.webtest文件时,您会看到标题部分会附加在请求下。
  6. <Request>
      <Headers>
        <Header Name="Authorization" Value="Basic QWxhZGRpbjpPcGVuU2VzYW1l" />
      </Headers>
    </Request>
    

答案 1 :(得分:1)

Ping 测试应该比较简单,目前有几种方法可以防止此类 url 被匿名访问,例如策略或操作过滤器。

基于策略的授权

让我们创建一个简单的策略,它需要查询字符串中的密钥。

首先,使用处理程序创建需求,例如:

public class HasSecretKeyRequirement : IAuthorizationRequirement
{
}

public class HasSecretKeyRequirementHandler : AuthorizationHandler<HasSecretKeyRequirement>
{
   private readonly IHttpContextAccessor _httpContextAccessor;
   private readonly IConfiguration _configuration;

   public HasSecretKeyRequirementHandler(IHttpContextAccessor httpContextAccessor, IConfiguration configuration)
   {
       _httpContextAccessor = httpContextAccessor;
       _configuration = configuration;
   }

   protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, HasApiKeyRequirement requirement)
   {
       var httpContext = _httpContextAccessor.HttpContext;
            
       if (httpContext == null)
       {
           context.Fail();
           return Task.CompletedTask;
       }
            
       if (httpContext.Request.Query.TryGetValue("SecretKey", out extractedSecretKey))
       {
           var secretKey= _configuration.GetValue<string>("SecretKey");
 
           if (secretKey.Equals(extractedSecretKey))
           {
               context.Succeed(requirement);
               return Task.CompletedTask;
           }
        }
            
        httpContext.Response.ContentType = "text/plain";
        httpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
                    
        context.Fail();
        return Task.CompletedTask;  
    }
}

然后创建一个包含需求的新策略并注册需求处理程序:

services.AddAuthorization(options =>
{
   options.AddPolicy("HasSecretKey", policy =>
      policy.Requirements.Add(new HasSecretKeyRequirement()));
);

services.AddSingleton<IAuthorizationHandler, HasSecretKeyRequirementHandler>();

将策略应用到您的 ping 端点:

[Authorize(Policy = "HasSecretKey")]
[HttpGet("api/ping")]
public IActionResult Ping()
{
   return Ok();
}

Finallddd 配置您的可用性测试:

https://yourapi.com/api/ping?SecretKey=yoursecretkey

这只是一个例子,您可以创建自己的需求和处理逻辑。您可以在应用程序中重用这些策略,例如在健康检查端点:

endpoints.MapHealthChecks("/health")
    .RequireAuthorization("HasSecretKey");

这种形式的授权在这种简单的情况下可能就足够了,但绝对不应该用于更高级的场景。

答案 2 :(得分:0)

供参考:根据上面@kaushal 回答中的片段,我能够扩展基本 URL Ping 测试:) 我在 Terraform 中使用 XML,但您也可以通过 {{ 3}} 直接。在我的情况下,我需要添加一个任意标题

<WebTest Name="appinsights-webtest" Id="ABD48585-0831-40CB-9069-682EA6BB3583" Enabled="True" CssProjectStructure="" CssIteration="" Timeout="30" WorkItemIds="" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010" Description="" CredentialUserName="" CredentialPassword="" PreAuthenticate="True" Proxy="default" StopOnError="False" RecordedResultFile="" ResultsLocale="">
  <Items>
    <Request Method="GET" Guid="a5f10126-e4cd-570d-961c-cea43999a200" Version="1.1" Url="https://example.com/health/stamp" ThinkTime="0" Timeout="30" ParseDependentRequests="False" FollowRedirects="False" RecordResult="True" Cache="False" ResponseTimeGoal="0" Encoding="utf-8" ExpectedHttpStatusCode="200" ExpectedResponseUrl="" ReportingName="" IgnoreHttpStatusCode="False">
      <Headers>
        <Header Name="X-Azure-FDID" Value="xxxxxxxxxxxx-xxxxxxxx-xxx" />
      </Headers>
  </Request>
  </Items>
</WebTest>

我没有在任何地方找到这个文档,但对我来说就像预期的一样。