2016-03-29 1 views
1

WebAPIへのWebClientコールをカプセル化して、私は基本認証を実装しようとしています。私はいくつかの方法を試して、WebAPIにフィルタを追加することで解決しました。こちらはWebAPI Authentication Filterです。WebClientを使用してIIS WebAPIへの基本認証呼び出しを行うにはどうすればよいですか?

FYI:これはファイルアップロードツールであるため、ファイルは最大10MBのテキストログになるため、1回だけデータを送信することをお勧めします。したがって、最初の連絡先のヘッダーを作成しています。 PowerShell Cmdletから

:401製造されるように、このコードを実行

private async Task<string> Run(string postBody, string Username, string Password) 
{ 
    using (var client = new WebClient()) 
    { 
     client.Headers[HttpRequestHeader.ContentType] = Common.DefaultMediaType; 

     var credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(Username + ":" + Password)); 
     client.Headers[HttpRequestHeader.Authorization] = $"Basic {credentials}"; 

     string response; 
     try 
     { 
      response = await client.UploadStringTaskAsync($"{_baseAddress}/{_uriTestConPost}", postBody); 
     } 
     catch (WebException ex) 
     { 
      var webResponse = ex.Response as HttpWebResponse; 
      if (webResponse == null) throw ex; 

      WriteWarning("WebException: " + webResponse.StatusCode); 
      return null; 
     } 
     return response; 
    } 
} 

、デバッガでないエコー。

資格情報とヘッダーをコメントアウトしてこのコードを実行すると、Fiddlerから、承認のないメッセージと承認のメッセージが2つ作成されます。どちらも401 で拒否されますが、WebAPI Controllerのデバッガでは、最初に認証しようとしていますが、2回目の試みはコード化された認証ヘッダーで正しく行われますが、デバッガを使わずに401で拒否されます。

ApiControllerが、私はそれを確認するために作ることができるのと同じくらい簡単です:

public class TestReportController : ApiController 
{ 
    [HttpPost] 
    [McpBasicAuthenticationFilter] 
    public async Task<string> TestConnectionPost() 
    { 
     dynamic message = await Request.Content.ReadAsStringAsync(); 

     return "You sent " + message.ToString(); 
    } 
} 

この時点で、私は、認可の問題は私のweb.Configや私のIISの設定で考えなければなりません。 IISの場合、匿名および基本認証が有効になっています(サイトの他の部分では匿名アクセスが必要です)。私が言うことができるものからWebConfigの

重要エリア:資格情報を持つ要求をブロックしている何

<system.web> 
    <authentication mode="None" /> 
    <compilation debug="true" targetFramework="4.5.1" /> 
    <httpRuntime targetFramework="4.5.1" executionTimeout="240000" maxRequestLength="1073741824" /> 
    <identity impersonate="false" /> 
</system.web> 

+0

独自のカスタムヘッダーを追加する代わりに、[資格情報](https://msdn.microsoft.com/en-us/library/system.net.webclient.credentials(v = vs.110))を使用しないでください。 aspx)プロパティをWebClientのですか? – mason

+1

IISの設定を確認しましたか?基本的な身元確認は認められています可能であれば、Webサーバ自体からapiにアクセスして、それが応答するかどうかを調べることから始めます。 –

+0

'.Credentials = new NetworkCredential(Username、Password);を使用して@masonを呼び出すと、標準的な方法が実行されます。匿名要求を送信すると失敗し、資格情報を使用して再送信されます。このツールは最終的に大規模なログファイルをサーバーにプッシュします(最大のものは理論的に180MBです)。私は情報を2回送信することを避けたいと考えています。私が追加しているのはカスタムヘッダーではなく、 'HttpRequestHeader.Authorization'は.NETが提供する定数値です。これは 'WebClient'で自動化されたものを手動で行うことです。 –

答えて

1

これを見てください:https://msdn.microsoft.com/en-us/library/aa292114(v=vs.71).aspx これは私がIIS認証を理解する方法です。私は権威ではありませんが、私はそれをどのように使用し、どのように私のために働くかを教えていきます。基本的にIISの認証は、Webサイトにクライアントとサーバー間のハンドシェイクの処理方法を指示しますが、すべてWindowsのアクセス許可を使用します。 (匿名ユーザーであっても、ユーザーはIISの既定のユーザーアカウントまたはサイトにアクセスするためのアクセス許可を持つユーザーを使用する必要があります)。
WindowsまたはFormsを使用できるASP.NET認証があります。私はアクティブなディレクトリからではなく、データベースからユーザーを検証する場合、私はIISで匿名認証を使用し、web.configでフォーム認証を使用します。資格情報は、ログオンフォームまたはクエリ文字列を使用して渡されます。 私は最近ASP.Netのアイデンティティを使用しています。ほぼすべての配管作業を行い、セットアップが非常に簡単です。 https://blogs.msdn.microsoft.com/webdev/2013/10/20/building-a-simple-todo-application-with-asp-net-identity-and-associating-users-with-todoes/ もちろんこれにはたくさんのものがあります。

+0

私は少しプロジェクトから引き離されたので、これを後で見ていく必要があります。私はアイデンティティで多くのイントラネット認証を使用していますが、残りは私とは少し異なり、私は少しこれに取り組まなければなりません。私があなたのデータからこれを理解することができれば、私はそれを確かに回答とマークするでしょうが、それは数週間かもしれません。 –

関連する問題