我正在尝试搜索这个问题,但没有太多运气。
这个想法是设计一个最初只会被内部Web前端消费的web api(例如asp.net MVC应用程序)。原因是我现在没有太多时间花在使webapi安全上(可能将来应用程序将暴露给www)。
我尝试过DotNetOpenAuth,但它没有很好的文档。
所以问题是如何在没有太多复杂的安全代码的情况下保护web api,以便它可以安全地与我的ASP.NET MVC应用程序通信?
或者这是一种完全错误的做法。也许我应该在开始时保护我的webapi?
无论如何,有谁知道如何实现这一目标?任何文章或评论?
由于
答案 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:")));