单个客户端(消费者)的web api安全性

时间:2014-05-15 14:15:49

标签: c# asp.net asp.net-mvc security asp.net-web-api

我正在尝试搜索这个问题,但没有太多运气。

这个想法是设计一个最初只会被内部Web前端消费的web api(例如asp.net MVC应用程序)。原因是我现在没有太多时间花在使webapi安全上(可能将来应用程序将暴露给www)。

我尝试过DotNetOpenAuth,但它没有很好的文档。

所以问题是如何在没有太多复杂的安全代码的情况下保护web api,以便它可以安全地与我的ASP.NET MVC应用程序通信?

或者这是一种完全错误的做法。也许我应该在开始时保护我的webapi?

无论如何,有谁知道如何实现这一目标?任何文章或评论?

由于

1 个答案:

答案 0 :(得分:2)

我会创建一个简单的DelegatingHandler,它将在每次请求之前被调用

public class AuthorizationDelegatingHandler : DelegatingHandler
{
    private const string API_KEY = "8139E7541722F5D91ED8FB15165F4"

    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, 
        CancellationToken cancellationToken)
    {
        if (request.Headers.Authorization == null)
            return request.CreateResponse(HttpStatusCode.Unauthorized);

        if (request.Headers.Authorization.Scheme != "Basic")
            return request.CreateResponse(HttpStatusCode.Unauthorized);

        var authToken = request.Headers.Authorization.Parameter;

        var apiKey = Encoding.UTF8.GetString(Convert.FromBase64String(authToken))
            .Split(':')
            .FirstOrDefault(x => !string.IsNullOrWhiteSpace(x));

        if (string.IsNullOrWhiteSpace(apiKey) || apiKey != API_KEY)
           return request.CreateResponse(HttpStatusCode.Unauthorized);

        return await base.SendAsync(request, cancellationToken);
    }
}

我知道使用静态令牌可能不是最好的,但它应该给你一个想法。

在您的应用程序引导程序中,您需要注册此处理程序

GlobalFilters.Filters.Add(new AuthorizationDelegatingHandler());

然后,当您调用此API时,可以使用Basic方案添加Authorization标头。

每个没有此标头的请求都将返回未经授权的响应。

客户端应该以这种方式调用API:

var client = new HttpClient
{
    BaseAddress = new Uri(API_URL)
};

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
    "Basic",
    Convert.ToBase64String(Encoding.UTF8.GetBytes("8139E7541722F5D91ED8FB15165F4:")));