0

私はMVC3サイトを持っており、一部のコントローラー/アクションにはWindows認証が必要ですが、他のコントローラー/アクションには必要ありません。つまり、匿名です。

サイトはしばらくの間正常に動作し、匿名アクションと認証済みアクションの両方にアクセスできます(プロンプトなしで、資格情報はChrome / IE / Firefoxで自動的に渡されます)が、認証が機能しなくなり、認証されていない資格情報の入力を求められ始めます受け入れられました。

サーバー全体を再起動するか、サイトの物理パスを別のアプリに変更し、認証されたリクエストを行う必要があります。これは、元のサイトに戻ったときに機能します。その後、すすぎと繰り返しの状況ですが、パターンが見つかりません。何もしなければ、認証は壊れたままになります。

IIS7.5を次のように構成しています。

アプリプール

  • .NETFrameworkバージョン-v4.0
  • マネージドパイプラインモード-統合
  • アプリケーションプールID-ApplicationPoolIdentity

サイト

  • 匿名認証-有効
  • 匿名ユーザーID-IUSR[これがデフォルトだと思います]
  • ASP.NETのなりすまし-無効
  • フォーム認証-無効
  • Windows認証-有効
  • Windows認証拡張保護-オフ
  • Windows認証カーネルモード認証を有効にする-オン
  • Windows認証プロバイダー-ネゴシエート、NTLM

コントローラー

// Anonymous Controller
    public class HomeController : Controller
    {
       public ActionResult Index()
       {
          return this.View();
       }
    }

// Authenticated Controller
    [Authorize]
    public class AnotherController : Controller
    {
       public ActionResult Index()
       {
          var viewModel = // create view model;
          return this.View(viewModel);
       }
    }

常に、認証が機能しているかどうかにかかわらず、GET to / home/indexは200を返します。期待どおりです。認証が機能している場合、/ another/indexへのGETリクエストは次のようになります。

> GET /another/index
  Response: 401
  Response Headers: WWW-Authenticate: NTLM, WWW-Authenticate:Negotiate


> GET /another/index
  Request Header: Authorization: Negotiate TlRMIVNDUAACAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw==
  Response: 401
  Response Header: WWW-Authenticate: Negotiate TlRMTVNTUAACAAAACAAEADgAAAAVgoni2YSlwIHmCL4AAAAAAAAAAIgAiAA8AAAABgGxHQAAAA9GAFIAAgAEAEYAUgABABQARgBSAEkATgBUAFIAQQBOAEUAVAAEABQARgBSAC5ATgBEAFMALgBjAG8AbQADACoARgBSAKkATgBUAFIAQQBUAEUAVAAuAGCAcgAuAG4AZACzAC4AYvBvAG0ABQAOAE4ARABTAC6AYwBvAG0ABwAIAOST3lPK980BAAAAAA==

 > GET /another/index
   Request Headers: Authorization: Negotiate TlRMTVNTUAACAAAACAAEADgAAAAVgoni2YSlwIHmCL4AAAAAAAAAAIgAiAA8AAAABgGxHQAAAA9GAFIAAgAEAEYAUgABABQARgBSAEkATgBUAFIAQQBOAEUAVAAEABQARgBSAC5ATgBEAFMALgBjAG8AbQADACoARgBSAKkATgBUAFIAQQBUAEUAVAAuAGCAcgAuAG4AZACzAC4AYvBvAG0ABQAOAE4ARABTAC6AYwBvAG0ABwAIAOST3lPK980BAAAAAA==
   Response: 200

認証が中断されると、/ another/indexへのGETリクエストは次のようになります。

> GET /another/index
  Response: 401
  Response Headers: WWW-Authenticate: NTLM, WWW-Authenticate:Negotiate


> GET /another/index
  Request Header: Authorization: Negotiate TlRMIVNDUAACAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw==
  Response: 401
  Response Headers: WWW-Authenticate: NTLM, WWW-Authenticate:Negotiate

この時点で、入力した資格情報の入力を求められます。同じ要求で、応答が再送されます。

> GET /another/index
      Request Header: Authorization: Negotiate TlRMIVNDUAACAAAAl4II4gAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw==
      Response: 401
      Response Headers: WWW-Authenticate: NTLM, WWW-Authenticate:Negotiate

何かが正しく構成されていないかどうか(私はそれが機能しないか、まったく機能しないと確信しています)、認証が失敗する理由、またはそれを停止する方法を誰かが知っていますか?

どうもありがとうございました。

4

1 に答える 1

0

したがって、これはweb.configのhttpErrorsセクションの不適切な使用の結果であることがわかります。

<httpErrors errorMode="Custom">
      <remove statusCode="401" subStatusCode="-1"/>
      <error statusCode="401" path="/Unauthorized" responseMode="ExecuteURL"/>
      <remove statusCode="403" subStatusCode="-1"/>
      <error statusCode="403" path="/Unauthorized" responseMode="ExecuteURL"/>
      <remove statusCode="404" subStatusCode="-1"/>
      <error statusCode="404" path="/NotFound" responseMode="ExecuteURL"/>
      <remove statusCode="500" subStatusCode="-1"/>
      <error statusCode="500" path="/ServerError" responseMode="ExecuteURL"/>
    </httpErrors>

これにより、認証が必要なときにサーバーから送信されないクレデンシャルを再送信するというNTLM要件が発生しました。すなわち、何が起こるべきか要求、チャレンジ(資格情報を使用して再送信してください)応答。実際に何が起こったのか要求、応答。チャレンジは送信されませんでした。

正しいアプローチは、このセクションを完全に削除することです。私のエラーでは、コントローラーアクションは拡張メソッドTrySkipIisCustomErrorsを使用します。

于 2013-03-25T16:23:49.247 に答える