我有一个用于验证请求头中包含的ApiKey的DelegatingHandler:
public class ApiKeyHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (!ApiKey.VerifyRequest(request))
{
var response = request.CreateErrorResponse(HttpStatusCode.Forbidden, "Invalid Api Key");
var tsc = new TaskCompletionSource<HttpResponseMessage>();
tsc.SetResult(response);
return tsc.Task;
}
return base.SendAsync(request, cancellationToken);
}
}现在我想扩展它来检查请求的来源,因为这个APIKey只对外部请求是必需的(CORS还没有被需要)。外部是由域及其独占的服务器到服务器定义的。
我找到了Is_Local属性,但这对我不起作用。
发布于 2014-08-26 17:33:22
我现在使用IP地址:((dynamic)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
发布于 2014-09-06 00:58:07
由于你似乎需要呼叫者的IP,WebApiContrib有一个很好的扩展方法,既可以在自主机上工作,也可以在web主机上工作:
public static class HttpRequestMessageExtensions
{
private const string HttpContext = "MS_HttpContext";
private const string RemoteEndpointMessage = "System.ServiceModel.Channels.RemoteEndpointMessageProperty";
public static string GetClientIpAddress(this HttpRequestMessage request)
{
if (request.Properties.ContainsKey(HttpContext))
{
dynamic ctx = request.Properties[HttpContext];
if (ctx != null)
{
return ctx.Request.UserHostAddress;
}
}
if (request.Properties.ContainsKey(RemoteEndpointMessage))
{
dynamic remoteEndpoint = request.Properties[RemoteEndpointMessage];
if (remoteEndpoint != null)
{
return remoteEndpoint.Address;
}
}
return null;
}
}https://stackoverflow.com/questions/25481500
复制相似问题