web-dev-qa-db-ja.com

Web APIでの「ウィンドウ」認証の適切な実装

企業ネットワークでのみ使用されるWeb Api 2アプリを作成しました。 Web APIでのWindows認証について読んだことがあるので、可能だと思われます。しかし、このための適切な実装を把握する必要があります。次のxmlをWeb.configに含めました。

<system.web>
  <authentication mode="Windows" />   
</system.web>

古い学校のウェブフォームアプリのイベントフックのいくつかのタイプを覚えているようです。ページをレンダリングする前にセキュリティチェックを行うことができるBeginRequest()のようなもの。コントローラーメソッドの1行目に次のコード行を含めましたが、返される値は意味のある情報のない空のオブジェクトのように見えます。

var identity = HttpContext.Current.User.Identity as WindowsIdentity;

Web API 2はWindows認証をサポートしていますか?ステップがありませんか?テストのためにPostmanから一般的なリクエストを送信した場合、Windows認証は機能しますか?私もこのコードを試しましたが、同様の空のオブジェクトがありました:

var x = RequestContext.Principal;

「統合セキュリティを有効にする」などのIIS設定を漠然と思い出します。正確な設定を指定してください。 IIS Expressでアプリを実行している場合、これを実現できますか?

[〜#〜] update [〜#〜]

以下の回答のいずれかで言及されているIIS Expressの手順に従いましたが、元の投稿で提供したコードサンプルにはまだユーザーオブジェクトが入力されていません。また、applicationhost.configファイルを更新して、匿名認証を無効にしました。

<anonymousAuthentication enabled="false" userName="" />

更新した後、Postman経由でテストリクエストを再送信しましたが、次のエラーが表示されます。

    <h3>HTTP Error 401.2 - Unauthorized</h3>
    <h4>You are not authorized to view this page due to invalid authentication headers.</h4>
</div>
<div class="content-container">
    <fieldset>
        <h4>Most likely causes:</h4>
        <ul>
            <li>No authentication protocol (including anonymous) is selected in IIS.</li>
            <li>Only integrated authentication is enabled, and a client browser was used that does not support integrated authentication.</li>
            <li>Integrated authentication is enabled and the request was sent through a proxy that changed the authentication headers before they reach the Web server.</li>
            <li>The Web server is not configured for anonymous access and a required authorization header was not received.</li>
            <li>The "configuration/system.webServer/authorization" configuration section may be explicitly denying the user access.</li>
        </ul>
    </fieldset>
</div>
<div class="content-container">
    <fieldset>
        <h4>Things you can try:</h4>
        <ul>
            <li>Verify the authentication setting for the resource and then try requesting the resource using that authentication method.</li>
            <li>Verify that the client browser supports Integrated authentication.</li>
            <li>Verify that the request is not going through a proxy when Integrated authentication is used.</li>
            <li>Verify that the user is not explicitly denied access in the "configuration/system.webServer/authorization" configuration section.</li>
            <li>Check the failed request tracing logs for additional information about this error. For more information, click 
                <a href="http://go.Microsoft.com/fwlink/?LinkID=66439">here</a>.
            </li>
        </ul>
    </fieldset>
</div>

これが機能するためには、何らかのタイプの特別なヘッダーでPostmanリクエストを設定する必要がありますか?

7
user9393635

IIS Expressを使用している場合、applicationhost.configファイルを更新する必要があります。

これは、Webサーバー自体を構成できるIIS構成ツールのファイルバージョンです。このファイルは次のディレクトリにあります。

%userprofile%\documents\iisexpress\config\applicationhost.config

または

%userprofile%\my documents\iisexpress\config\applicationhost.config

見つかったら、次のように更新します。

<windowsAuthentication enabled="true">
    <providers>
        <add value="Negotiate" />
        <add value="NTLM" />
    </providers>
</windowsAuthentication>

IISの場合:

  1. アプリケーションを選択してください
  2. ダブルクリック-「認証」
  3. Windows認証を有効にする
  4. 再起動IISサーバー

詳細はこちらをご覧ください 詳細

5
Hussein Salman

前の回答に加えて、クロスオリジンリクエストでcredentialsを渡す必要もあります。

サーバー側(Web API):

[EnableCors]属性でSupportsCredentialsプロパティをtrueに設定します。

[EnableCors(origins: "http://exampleclient.com", headers: "*", 
methods: "*", SupportsCredentials = true)]

クライアント側(UI):

XMLHttpRequest.withCredentialstrueに設定します。

jQuery:

$.ajax({
  type: 'get',
  url: 'http://www.example.com/api/auth',
  xhrFields: {
    withCredentials: true
  }

角度:

this.http.get('http://www.example.com/api/auth', { withCredentials: true }).subscribe((resp: any) => {
  console.log(resp)
}

XMLHttpRequest:

var xhr = new XMLHttpRequest();
xhr.open('get', 'http://www.example.com/api/auth');
xhr.withCredentials = true;
4
Adrita Sharma

ローカルドメインユーザーを使用し、イントラネットサイト用のWindows認証。

例:

固定ルートパスでTestAuthenticationメソッド/アクションを実装しました。デモでは、Authorize属性はまだ含まれていません。コードは、UserApiControllerプロパティをチェックします。これには、Thread.CurrentPrincipalまたはHttpContext.Current.Userと同じデータが含まれます。 IISの匿名認証が無効になっていることを確認してください。無効になっている場合、Identity.Nameは空になります。

public class WinAuthController : ApiController
{
    [HttpGet]
    [Route("api/testauthentication")]
    public IHttpActionResult TestAutentication()
    {
        Debug.Write("AuthenticationType:" + User.Identity.AuthenticationType);
        Debug.Write("IsAuthenticated:" + User.Identity.IsAuthenticated);
        Debug.Write("Name:" + User.Identity.Name);

        if (User.Identity.IsAuthenticated)
        {
            return Ok("Authenticated: " + User.Identity.Name);
        }
        else
        {
            return BadRequest("Not authenticated");
        }
    }
}

Web.configファイルで:

<system.web>
   <authentication mode="Windows" />
 </system.web> 

IE [ツール]> [インターネットオプション]> [詳細設定]で設定を確認し、[Windows統合認証を有効にする]設定を探します。[セキュリティ]タブ、[イントラネットおよびカスタムレベル]下部にある設定を見つけて、IEが自動的にログオンするか、ユーザー名とパスワードを要求するかを指定します。

enter image description here

以下のリンクにアクセスしてください。WEPAPI Windows認証のための適切な手順があります。

http://www.scip.be/index.php?Page=ArticlesNET38&Lang=EN

3
Mrunalini

以下は、ローカルおよびサーバー(IIS)の両方のWeb APIでWindows認証を構成する手順です。

1)ローカルの場合

a)Windows認証モードでWeb APIプロジェクトを作成するには、以下の手順に従います。

ASP.Net Webアプリケーションを選択した後、Web APIテンプレートを選択し、右側から認証の変更ボタンをクリックしてWindows認証

b)既存のWeb APIプロジェクトの場合は、applicationhost.configファイル。

<location path="YourProjectName">
        <system.webServer>
            <security>
                <authentication>
                    <anonymousAuthentication enabled="false" />
                    <windowsAuthentication enabled="true" />
                </authentication>
            </security>
        </system.webServer>
    </location>

2)サーバー(IIS)の場合

IISでアプリケーションをホストした後にWindows認証を実行するには、次の行をweb.configノード内のファイル:

<authentication mode="Windows" />
    <authorization>
      <allow verbs="OPTIONS" users="?" />
      <deny users="?" />
    </authorization>

どちらの場合も、Windows認証が適切に機能していることをコードで次の行を使用するだけです。

if(User.Identity.IsAuthenticated)
{
    //do work
}
2