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>
?
独自のカスタムヘッダーを追加する代わりに、[資格情報](https://msdn.microsoft.com/en-us/library/system.net.webclient.credentials(v = vs.110))を使用しないでください。 aspx)プロパティをWebClientのですか? – mason
IISの設定を確認しましたか?基本的な身元確認は認められています可能であれば、Webサーバ自体からapiにアクセスして、それが応答するかどうかを調べることから始めます。 –
'.Credentials = new NetworkCredential(Username、Password);を使用して@masonを呼び出すと、標準的な方法が実行されます。匿名要求を送信すると失敗し、資格情報を使用して再送信されます。このツールは最終的に大規模なログファイルをサーバーにプッシュします(最大のものは理論的に180MBです)。私は情報を2回送信することを避けたいと考えています。私が追加しているのはカスタムヘッダーではなく、 'HttpRequestHeader.Authorization'は.NETが提供する定数値です。これは 'WebClient'で自動化されたものを手動で行うことです。 –