Asp.net mvc 4 无法从委派处理程序Web API返回未经授权的HTTP

Asp.net mvc 4 无法从委派处理程序Web API返回未经授权的HTTP,asp.net-mvc-4,asp.net-web-api,Asp.net Mvc 4,Asp.net Web Api,我正在尝试在DelegatingHandler中实现身份验证。下面是一个例子 public class AuthHandler: DelegatingHandler { protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var auth = request.He

我正在尝试在DelegatingHandler中实现身份验证。下面是一个例子

public class AuthHandler: DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var auth = request.Headers.Authorization;
        if (!auth.Scheme.Equals("UberSecureScheme"))
        {
            return new Task<HttpResponseMessage>(() => new HttpResponseMessage(HttpStatusCode.Unauthorized)
                {
                    Content = new StringContent("You have no token")
                });
        }

        return base.SendAsync(request, cancellationToken);
    } 
}
这显然是一场灾难。我不能让某人做一个删除,然后告诉他们,他们是未经授权这样做

我还遇到过有人说,只是抛出一个HTTPResponseException。无论我在其中输入了什么状态代码(404、401,无论什么),浏览器都会收到500个内部服务器错误。

如果(!auth.Scheme.Equals(“UberSecureScheme”))
if (!auth.Scheme.Equals("UberSecureScheme"))
{
    var response = request.CreateResponse(HttpStatusCode.Unauthorized);
    response.ReasonPhrase = "You have no token";
    return Task.FromResult<HttpResponseMessage>(response);
}
{ var response=request.CreateResponse(HttpStatusCode.Unauthorized); response.ReasonPhrase=“您没有令牌”; 返回Task.FromResult(响应); }
您可以使用Async/wait。 我打字,不是复制/粘贴-不要问,所以希望没有打字错误……)

受保护的异步覆盖任务SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken)
var response=await base.sendaync(请求、取消令牌);
if(HttpContext.Current.User==null){
HttpResponseMessageErrorResponse=新的HttpResponseMessage();
errorResponse.Headers.Add(“WWW-Authenticate”,“一些与身份验证相关的消息”);
errorResponse.StatusCode=HttpStatusCode.Unauthorized;
返回错误响应;
}
返回响应;

你在跟我开玩笑。这就解决了问题。您能告诉我为什么/如何工作,但其他什么都没有吗?
request.CreateResponse
保存有关请求的信息,而
new-HttpResponseMessage
没有。至于
ContinueWith
它调用基本方法,所以控制器被执行。我理解为什么
ContinueWith
是错误的。我不敢相信人们会举这样做的例子,因为从代码和一个简单的测试中可以清楚地看出,它仍然执行控制器。但是我不能100%肯定新的HttpResponseMessage。如果我从请求中手动复制了更多信息,它会起作用吗?可能是,我没有尝试过。您可以查看
request.CreateResponse
的源代码。
if (!auth.Scheme.Equals("UberSecureScheme"))
{
    var response = request.CreateResponse(HttpStatusCode.Unauthorized);
    response.ReasonPhrase = "You have no token";
    return Task.FromResult<HttpResponseMessage>(response);
}
protected async override Task<HttpResponseMessage>              SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
var response = await base.SendAsync(request, cancellationToken);
if (HttpContext.Current.User == null) {
    HttpResponseMessage errorResponse = new HttpResponseMessage();
    errorResponse.Headers.Add("WWW-Authenticate", "Some auth related message");
    errorResponse.StatusCode = HttpStatusCode.Unauthorized;
    return errorResponse;
}
return response;