52

私はMVC4アプリケーションで遊んでいて、すべてのデータをフェッチ/送信するためにWebAPIを使用しています。コントローラで、HttpClientリクエストを使用してデータを取得していますが、すべて正常に機能しています。私が直面している問題は、プロジェクトでWindows認証が有効になっている場合、WebAPI呼び出しが401Unauthorizedエラーを返すことです。

呼び出しを行うコントローラーのコードは次のとおりです。

using (var client = new HttpClient())
{
    var invoiceDetailUrl = BASE_URL + Url.HttpRouteUrl(
        "DefaultApi",
        new { controller = "InvoiceDetails", id = id }
     );

     var result = client.GetAsync(invoiceDetailUrl).Result; 

 }

サイトでWindows認証をオンにする必要がありますが、必ずしもWebAPIコントローラーである必要はありません。以下のように、web.configでAPIコントローラーを除外してみました。

<location path="api">
        <system.web>
            <authorization>
                <allow users="*"/>
        </authorization>
    </system.web>
</location>

しかし、web.configへの追加は何もしませんでした。

助言がありますか?

4

3 に答える 3

77

認証

Web API は、認証がホストで行われることを前提としています。IIS は認証に HTTP モジュールを使用します。asp.net では、IIS または ASP.NET に組み込まれている認証モジュールを web.config を介して構成したり、独自の HTTP モジュールを記述してカスタム認証を実行したりできるようになりました。

ここに画像の説明を入力

同時に複数の認証を使用できますが、問題はありません。あなたの場合、Windows authentication と Anonymous authentication の両方が必要です。Windows 認証は Web サイトを保護し、匿名認証はWeb APIを開きます。

IIS で認証を構成する

IIS Express で のホスティング [プロパティ] ペインを開き (プロジェクトのプロパティではなく F4 を使用)、目的の認証を適用します。 [匿名認証] を [無効] に設定します。「Windows 認証」を「有効」に設定します。

IIS 7 以降でのホスティング IIS マネージャーで、機能ビューの認証機能を開きます。必要な認証を有効/無効にします。認証システムがオプションでない場合 (Windows など)、サーバー マネージャー (役割サービスの追加) を介してインストールする必要があります。

認可

asp.net 認証

ASP.NET では、特定のリソースへのアクセスを承認する方法が 2 つあります。ファイルと URL の承認です。ここでは説明しませんが、この記事を読むことができます。

重要なことは、web.config でユーザーやグループを許可/拒否できることです。

Windows 認証のデフォルト設定では、次のように認証ユーザーのみを許可します *****:

<authorization>
<deny users="?" ></deny>
</authorization>

匿名ユーザーを許可したい場合は? URL の場所「api」の下に、これを追加します。

<location path="api">
    <system.web>
        <authorization>
            <allow users="*"/>
        </authorization>
    </system.web>
</location>

ウェブ API 認可

asp.net Web Api 承認は、パイプラインの後半、コントローラーの近くで行われます。これにより、リソースへのアクセスを許可するときに、より詳細な選択を行うことができます。

Web API には、組み込みの承認フィルターAuthorizeAttributeが用意されています。AllowAnonymousAttributeもあります。コントローラーまたはアクションでグローバルに使用できます。デフォルトでは、すべてのアクションが許可されています。

API のテスト

ブラウザ経由

統合 Windows 認証は、ネゴシエート認証方式をサポートするすべてのブラウザーで機能します。これは、Internet Explorer の cas であり、現在は Chrome です。Windows 認証を使用して Web サイトを閲覧すると、Windows 資格情報が自動的に提供されます。Firefox はこのスキームをサポートしていないため、このブラウザで認証をテストすることがよくあります。

HttpClient 経由 HttpClient は、Web API (ブラウザーなど) を呼び出すときに資格情報を提供する必要があります。これは、適切な資格情報を使用して HttpClientHandler を構成することによって行われます。

//use default credentials aka Windows Credentials
HttpClientHandler handler = new HttpClientHandler()
{
    UseDefaultCredentials = true
};

//use username/password credentials
HttpClient client = new HttpClient(handler);

var handler = new HttpClientHandler {
    Credentials = new NetworkCredential(username, password)
};

var httpClient = new HttpClient(handler);

これがあなたを助けることを願っています。

あなたの場合の最後の重要なことは、Web Apiが匿名ユーザーをまったく許可しないことです! HttpClientHandler で既定の資格情報を使用しているため、これはサービスに Windows 認証が必要であることを意味します。オープン & パブリック サービスでは資格情報を構成する必要はありません。

于 2013-05-23T08:24:49.163 に答える
28

非常に似たようなことをしようとしているときにこの質問に出くわし、上記の回答に追加したいと思いました。これを行う方法に関する詳細な情報はあまり見つかりませんでした。ウェブ全体でほんの少しずつ。うまくいけば、これがそこにあるものに追加されるでしょう.

WebAPI 部分を持つ MVC4 アプリケーションがあります。MVC アプリは Windows 認証を使用する必要がありますが、WebAPI 部分は匿名で、Windows 認証を無効にする必要がありました。上記のソリューションは ncbl では機能しましたが、私のシナリオではコードを使用して資格情報を処理していなかったため、うまくいきませんでした。私のシナリオでは、web.config または IIS ベースのソリューションが必要でした。Cyber​​maxs の web.config ソリューションから始めて、それに追加しました。これが私が最終的に得たものです。

<!-- Configure the virtual path api -->
<!-- This section is like a mini-web.config for the virtual path -->
<location path="api">
    <system.web>
        <authorization>
            <!-- All anonymous users access to the virtual path api -->
            <allow users="?" />
        </authorization>
    </system.web>
    <!-- Need to include the security overrides else it will inherit from the root of the application -->
    <system.webServer>
        <security>
            <authentication>
                <!-- Need to enable anonymous access and turn off Windows authentication for the virtual path -->
                <anonymousAuthentication enabled="true"/>
                <windowsAuthentication enabled="false"/>
            </authentication>
        </security>
    </system.webServer>
</location>

私にとっての鍵は、<system.webServer>セクションを web.config に追加して、この仮想パスの認証をオーバーライドできるようにすることでした。IIS でこれを実行しようとしましたが、仮想パスであったため、つまり /api が Web サーバーに存在しないため、これはできませんでした。

<authentication>注: IISには、application.config や machine.config など、セクションをロックしているより高い構成レベルの構成ファイルがある場合があることに注意してください。要素の属性 allowOverride が false に設定されている場合があります。最初は HTTP エラー 500.19 (HRESULT: 0x80070021) が発生し、application.config ファイルに移動してこの属性を変更する必要がありました。このエラーの詳細については、こちらを参照してください

<location>web.configのセクションにこの追加セクションを作成したら、API コントローラーを[AllowAnonymous]. その後、バム...すべてが機能し始めました。

これは、アプリケーションのルートの認証と承認をセットアップする方法です。

<system.web>
  <authentication mode="Windows" />
  <authorization>
    <!-- Deny all anonymous users at the root of the application -->
    <deny users="?" />
  </authorization>
</system.web>
于 2013-12-05T20:00:54.370 に答える
4

これは私がしなければならなかったことです:

<location path="api">
    <system.web>
        <authorization>
            <allow users="*"/>
        </authorization>
    </system.web>
</location>
于 2014-06-04T23:12:07.427 に答える