1

IISのWindows認証で保護されるASP.NETWebAPIを使用してASP.NETMVC4Webサイトを構築しました。Visual Studioでは、問題なく動作します。HttpClientの呼び出しは機能しており、常にステータスコード200とともにデータを返します。ただし、IISに公開すると、問題が発生します。APIを呼び出そうとすると、次の設定で常に401Unauthorizedが表示されます。

認証:Windows認証のみ認証:1人のユーザーのみを許可します-私。

ただし、[承認]を[すべて許可]に変更すると、正常に機能しますが、それは私が望む動作ではありません。

自分のアカウントにのみ認証を設定して、ブラウザからAPIを直接呼び出してみました...そしてそれは良い小さなApiのようにうまく機能します。別のユーザーとしてログオンしない限り、不正なエラーは発生しません。

したがって、これにより、WebサイトがAPIと通信する方法に問題があると結論付けることができると思います。そのための私のコードは次のとおりです。

public ActionResult Index()
{
    HttpClientHandler handler = new HttpClientHandler();
    handler.UseDefaultCredentials = true;

    using (HttpClient client = new HttpClient(handler))
    {
        var clientResult = client.GetAsync(
        string.Format(@"{0}{1}",ConfigurationManager.AppSettings["WebApiBaseUri"].ToString(), "products")
        ).Result;
        clientResult.EnsureSuccessStatusCode();
        //if (clientResult.StatusCode != HttpStatusCode.OK)
        //{
        //    ViewBag.Error = clientResult.StatusCode;
        //    ViewBag.User = userName;
        //    ViewBag.Message = clientResult.Content.ReadAsStringAsync().Result;
        //    return View();
        //}

        var receivedData = clientResult.Content.ReadAsStringAsync().Result;
        List<ProductModel> data = JsonConvert.DeserializeObject<List<ProductModel>>(receivedData);
        return View(data);
    }
}

API側のコードは次のとおりです。

public IQueryable<Product> Get()
{
    _context = new InventoryContext();
    return _context.Products.AsQueryable();
}

誰かが私が間違っていることを知っていますか?

4

1 に答える 1

0

問題は、HttpClient 要求を実行する IIS プロセスが、要求を行ったユーザーの資格情報を Web サイトに送信すると想定していることです。資格情報を渡すように Kerberos を設定しない限り、これは当てはまりません。代わりに、既定の資格情報は、IIS のアプリケーション プールを実行するように設定されているユーザーの資格情報を送信します。別の質問には、この質問に対するより詳細な回答と、Kerberos を使用する方法に関するいくつかの指示があります: ASP.NET は Windows 認証資格情報を渡します。IIS プロセスが実行されているアカウントを承認リストに追加した場合、呼び出しが成功するはずですが、これはあなたが望んでいる方法ではないと思います。

于 2016-08-23T15:12:16.053 に答える