2012-03-19 16 views
0

かなり広範囲なRESTサービスをWCFからASP.NET WebAPIに移行しています。私たちはAuthorizationヘッダーを使用してクライアントからサーバーにトークンを送信しています。有効なAuthorizationヘッダーが見つからなくなったらすぐに401で応答するコードでDelegateHandlerを実装しました。コードの簡略化はここで見ることができます:HttpSelfHostServerを使用しているときにヘッダーが消えています

public class AuthenticationHandler : DelegatingHandler 
{ 
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     if (request == null) throw new ArgumentNullException("request"); 
     return !IsClientAuthorized(request) 
      ? Task<HttpResponseMessage>.Factory.StartNew(() => new HttpResponseMessage(HttpStatusCode.Unauthorized)) 
      : base.SendAsync(request, cancellationToken); 
    } 

    private bool IsClientAuthorized(HttpRequestMessage request) 
    { 
     return request != null && !string.IsNullOrEmpty(request.Headers.Authorization.ToString()); 
    } 
} 

IISでホストされているとき、それは正常に動作しますが、統合テストのために私はHttpSelfHostServerを使用していて、ここでAuthorizationヘッダにも私ができるものの、HttpRequestMessage上に存在しませんそれがフィドラーのトレースで送られたのを見てください。

セルフホスティングを使用して問題が一貫していることを確認するために、本当にシンプルなWebAPIアプリケーションを作成しようとしましたが、残念ながらそこに期待どおりに機能します。だから、どうにかして私のコードに関連しなければならないが、私はそれを引き起こしていることを完全に空白にしている。

他に誰もこの動作を見たことがありますか、誰かがWebAPIスタックのどこが間違っているかをトレースする方法についての提案はありますか?

答えて

1

問題は、送信されているAuthorizationヘッダーの形式に起因することが判明しました。

Authorization: 42w4hGtmB7blLOXjcsx8AIbBEhxNpQpj3VNnf89vvjAkJEoX9S+JtmkYZcth+B9y/8Cc3tm1XDOFxGTqN1Hi2Q== 

これは、WCFの下でうまく働いたが、それは制度や価値を期待HTTP規格に従ってフォーマットされていません。私たちは、Authorizationヘッダーはこのような何かを見て期待します。たとえば:

Authorization: XAPI 42w4hGtmB7blLOXjcsx8AIbBEhxNpQpj3VNnf89vvjAkJEoX9S+JtmkYZcth+B9y/8Cc3tm1XDOFxGTqN1Hi2Q== 

私の推測では、ヘッダー内の値だけで、ウェブAPIは、スキームとしてこれを考えるだろう、とだけ特定の文字がここで許可されていることです。スキームとしてXAPIを追加して同じ値を使用したとき、すべて正常に機能し、AuthorizationヘッダーはHttpRequestMessage.Headers.Authorization上の自分のコードで利用可能でした。

しかし、Web APIのバグだと思います。要求が進行することが許可されていて、ヘッダが無効な形式であれば無視されます。ヘッダーが仕様に違反していれば、400 Bad Requestで応答すると思います。

関連する問題