我正在尝试在需要基本身份验证的端点上使用Azure Application Insights设置可用性测试(URL Ping测试)。看来这个标准的做法
Azure不接受https://username:password@myendpoint.com
(错误消息表明网址格式错误,并且可能在开头时缺少https / http)。
除了使用多步骤Web测试或Azure功能之外,还有其他方法可以实现这一点,假设我想留在Azure生态系统中吗? :)
答案 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]
- 用户名和密码与单个冒号组合在一起。 (:)
- 结果字符串被编码为八位字节序列。[7]
- 使用Base64的变体对结果字符串进行编码。[8]
- 然后将授权方法和空格预先添加到编码的字符串中,用空格分隔(例如&#34; Basic&#34;)。
醇>例如,如果浏览器使用 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 :(得分: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>
我没有在任何地方找到这个文档,但对我来说就像预期的一样。