web-dev-qa-db-ja.com

MVC5認証の「...とプライマリドメイン間の信頼関係に失敗しました」

Windows認証を使用しているnotASP .NET MVC5アプリケーションがあります。

開発中のドメイン外でアプリケーションを実行し、(何らかの理由で)次のものを取得するまで、すべてが正常に機能していました。

_The trust relationship between this workstation and the primary domain failed.
_

User.IsInRole("Admin")を実行しようとしているとき。

.NETの Identity からカスタムRoleIdentityStoreRoleStoreIdentityなどを使用しています。また、ユーザーとロールのデータが(MongoDB)データベースから正しく取得されていることがわかります。

この問題に関して多くの質問がありますが、それらはWindows認証を使用するからのものです。 MVCアプリケーションでの偽装:

Active Directoryを使用しておらず、(私の知る限り)PCのドメインに依存する可能性のあることを何もしていないのに、なぜこのSystemExceptionを取得するのですか?一部の構成が欠落していますか(_Web.config_またはIIS Express)のどちらか)

編集:

さて、少し絞り込みます...

User.IsInRole("Admin")行は、__Layout.cshtml_ビューのif()ステートメント内にあります(つまり、ロールに応じてナビゲーションバーに何を表示するかを知るため)。

ユーザーが認証されておらず、devに使用したドメインにいない場合にのみ、上記のエラーが発生することがわかりました。その行にブレークポイントを配置すると、Userオブジェクトは_System.Security.Principal.WindowsIdentity_であり、その基になるIdentityは_System.Security.Principal.WindowsIdentity_であることがわかります。

一方、ユーザーが認証された場合、Userオブジェクトとts Identityは_System.Security.Claims.ClaimsPrincipal_および_System.Security.Claims.ClaimsIdentity_です。

(認証されていない場合)Windows Identityを使用しているのはなぜですか?無効にするにはどうすればよいですか?

29
user1987392

そのため、編集に基づいて、_Layout.cshtmlので、代わりに

@if(User.IsInRole("Admin"))  {...}

私が持っています

@if(User.Identity.IsAuthenticated && User.IsInRole("Admin")) {...}

問題を解決するようです。

問題は、ASP .NET Identityempty WindowsIdentity を使用します。ユーザーが認証されず、User.IsInRoleをチェックしようとすると、Active Directoryに対してWindowsIdentityのロールをチェックしようとします。私が持っていないこと。明らかに、ロールをチェックする前にユーザーがログインしているかどうかを最初にチェックする必要があるため、mea culpaです。

しかし、上記の変更によりコードが修正されたように見えますが、この動作についてもっと知りたいと思っています。なぜ空のSystem.Security.Principal.WindowsIdentityユーザーが認証されていない場合。それを説明するどんな答えでも受け入れます。

30
user1987392

この問題が発生しました-存在しないActive Directoryグループをテストすると失敗しました。

存在するグループを使用していることを確認してください!

6
David McEleney

新しい本番サーバーでも同じ問題が発生していました。 Identity Frameworkを使用して、認証されていないユーザーを拒否するweb.configファイルを使用して特定のディレクトリへのアクセスを制限します。認証されていないユーザーがUser.IsInRole("RoleName")コードを含むこのディレクトリのページにアクセスしようとすると、「信頼関係...」エラーが発生していました。

他のSOの回答に記載されている修正はいずれも機能しませんでした。

IIS-問題解決済みでフォーム認証を有効にする必要がありました。

0
Scotty

「プライマリドメインとワークステーション間の信頼関係が失敗しました」というエラーメッセージは、通常、 コンピューターをドメインから削除してから再参加する が必要です。これを行うにはいくつかの方法があります。上記のリンクに含まれているように、エラーを表示しているコンピューター上で、またはリモートで行う方法に関する指示があります。 Active DirectoryおよびPowerShellでも実行できます。

0
Laura

システムでこれを解決しましたが、残念ながら、他の提案はどれもうまくいきませんでした。この問題は、コードがアクセスしようとしたネットワークフォルダー内の孤立したSIDが原因で発生しました。削除すると、再び機能し始めました。

0
Jon

私にとっては、メンバーシッププロバイダーの構成タグ全体がありませんでした。以前のアプリからそれらをコピーした後、うまくいきました。

  <system.web>
<authentication mode="Windows" />
<compilation debug="true" targetFramework="4.7.1" />
<httpRuntime targetFramework="4.7.1" />
<httpModules>
  <add name="TelemetryCorrelationHttpModule" type="Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule, Microsoft.AspNet.TelemetryCorrelation" />
  <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
</httpModules>
  <profile defaultProvider="DefaultProfileProvider">
  <providers>
    <add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
  </providers>
</profile>
<membership defaultProvider="DefaultMembershipProvider">
  <providers>
    <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
  </providers>
</membership>
<roleManager defaultProvider="CustomRoleProvider" enabled="true" cacheRolesInCookie="false">
  <providers>
    <add name="CustomRoleProvider" type="ABC.ABCModels.ABCRoleProvider" />
  </providers>
</roleManager>
<sessionState mode="InProc" customProvider="DefaultSessionProvider">
  <providers>
    <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
  </providers>
</sessionState>
0
venu
<authorization>
            <allow roles="pri\Domain Users" users="pri\domain_user" />
            <deny users="?" />
</authorization>
  • web.configファイルに上記の行があることを確認し、正しいユーザー名でユーザーフィールドに入力してください。
0
albin.varghese

カスタム認証モジュールを使用した場合とまったく同じシナリオで、IsInRoleを実行した場合も同じエラーが発生しました。最高ランクのソリューション(User.Identity.IsAuthenticated && ...)は役に立ちませんでした。だから、私はそれでかなり遊んだ。最後に、web.configファイルのモジュール宣言から(preCondition = "managedHandler")属性を削除する必要があることがわかりました。したがって、代わりに:

  <system.webServer>
    ...
    <modules>
          ...
          <add name="CompanyAuthentication" type="Company.Authentication.AuthHttpHandler" preCondition="managedHandler" />
    </modules>

私が持っている必要があります:

  <system.webServer>
    ...
    <modules>
          ...
          <add name="CompanyAuthentication" type="Company.Authentication.AuthHttpHandler" />
    </modules>

それは私のためにトリックをしました!

0
Greg Z.