目录
介绍
背景
使用代码
兴趣点
演示了一个简单的Web请求示例,以及在登录之前需要进行哪些后期处理。记录完整的Web请求可能会导致安全问题,但是有通用/可重用的方法可以防止此问题。显示了使用这种方式的代码。
介绍这些天,安全性非常重要。隐私法规越来越严格,黑客越来越聪明,数据的价值也在增加。在培训和课程中,经常会告诉开发人员使用https和使用身份验证。作为开发人员,您还需要了解其他事项。在本文中,将解释这些事情之一。
背景如果您对.NET开发有一定的了解,这将非常有帮助,最好使用.NET Core,因为这是我们在这里使用的技术。如果您使用Xamarin或.NET Framework,则本文可能也很清楚,并且对您的日常工作很有用。
使用代码在此处显示的代码中,Web请求被发送到外部服务。就本文而言,与什么服务无关。重要的是完成了一些Web请求并使用了授权。
static async Task Main()
{
using (var httpClient = new HttpClient(new SafeHandler()))
{
httpClient.BaseAddress = new Uri("https://www.google.com/");
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "DummyToken");
var response = await httpClient.GetAsync("");
Console.WriteLine($"Returned status code: {response.StatusCode}");
Console.WriteLine("END");
}
}
从逻辑上讲,Web请求很重要,重要事件需要记录,日志输出需要测试。如果您想了解更多有关此的知识,则可能需要阅读这篇文章。我们在这里可以做的只是添加执行完整请求记录的代码。但是,这不是一个好计划。
日志记录需要与我们需要能够跟踪的数据一起完成,以防出现生产问题。不应该使用只有黑客才想知道的数据进行日志记录。这就是为什么上面提到的SafeHandler是在实现上面的代码之前实现的。这是SafeHandler的代码。出于演示目的,我们仅直接使用序列化方法并登录到控制台。最有可能的是,您希望使用更高级的日志记录方式,但这超出了本文的范围。
public class SafeHandler : DelegatingHandler
{
public SafeHandler()
{
InnerHandler = new HttpClientHandler();
}
protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var result = base.SendAsync(request, cancellationToken);
if (request.Headers.Authorization != null)
{
request.Headers.Authorization = new AuthenticationHeaderValue(request.Headers.Authorization.Scheme, "***");
}
var toLog = JsonConvert.SerializeObject(request);
Console.WriteLine(toLog);
return result;
}
}
从该代码中可以清楚地看出,请求在发送后会稍作修改。授权标头的实际值由星号代替。记录后将无法跟踪该值,但是很可能不需要它来解决生产问题。如果您的日志记录中存在安全问题,那么黑客也无法跟踪它,这才是重要的。您希望用星号替换的数据可能有所不同,但是很高兴认识到使用DelegatingHandler的方法可以帮助您。您如何以及在何处执行Web请求没有问题,如果你使用具有相同DelegatingHandler的HttpClient的代码将在所有情况下执行。如果您直接想要一个工作示例,则代码在GitHub上。
有关安全性的课程通常不会过多地关注日志记录。有关日志记录的课程通常不会过多地关注安全性。当我发现有问题的地方(在日志中看到令牌)时,我开始意识到需要缩小这一差距,这激发了我撰写本文的灵感。