web-dev-qa-db-ja.com

Web APIのWindows認証を無効にする

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

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

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

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

 }

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

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

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

助言がありますか?

46
ncbl

認証

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

enter image description here

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

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>

Web API認証

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

Web APIは、組み込みの許可フィルター AuthorizeAttribute を提供します。 AllowAnonymousAttribute もあります。コントローラーまたはアクションでグローバルに使用できます。デフォルトでは、すべてのアクションはauthorizedです。

APIのテスト

ブラウザ経由

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

Via HttpClientHttpClientは、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でDefault Credentialsを使用しているため、これはサービスがWindows認証を必要とすることを意味します。オープンサービスとパブリックサービスで資格情報を設定する必要はありません。

71
Cybermaxs

非常に似たようなことをしようとしたときにこの質問に出会い、上記の答えに追加したいと思いました。これを行う方法に関する詳細な情報はあまりありません。ウェブ全体でほんの少しだけ。願わくば、これが世の中に追加されることを願っています。

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サーバー上に存在しないため、これは不可能でした。

注:IISは、アプリケーションなどの<authentication>セクションをロックしている上位構成レベルに構成ファイルがある場合があります.configまたはmachine.config。要素のallowOverride属性がfalseに設定されている可能性があります。最初はHTTPエラー500.19(HRESULT:0x80070021)が発生し、この属性を変更するにはapplication.configファイルに移動する必要がありました。このエラーの詳細 here

Web.configの<location>セクションにこの追加セクションができたら、[AllowAnonymous]でAPIコントローラーを装飾するようにしました。それからバム...すべてが動き始めた。

これが、アプリケーションのルートの認証と承認の設定方法です。

<system.web>
  <authentication mode="Windows" />
  <authorization>
    <!-- Deny all anonymous users at the root of the application -->
    <deny users="?" />
  </authorization>
</system.web>
23
Notorious2tall

これは私がする必要があったものです:

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