Windows認証を使用しているnotASP .NET MVC5アプリケーションがあります。
開発中のドメイン外でアプリケーションを実行し、(何らかの理由で)次のものを取得するまで、すべてが正常に機能していました。
_The trust relationship between this workstation and the primary domain failed.
_
User.IsInRole("Admin")
を実行しようとしているとき。
.NETの Identity
からカスタムRole
、IdentityStore
、RoleStore
、Identity
などを使用しています。また、ユーザーとロールのデータが(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を使用しているのはなぜですか?無効にするにはどうすればよいですか?
そのため、編集に基づいて、_Layout.cshtml
ので、代わりに
@if(User.IsInRole("Admin")) {...}
私が持っています
@if(User.Identity.IsAuthenticated && User.IsInRole("Admin")) {...}
問題を解決するようです。
問題は、ASP .NET Identity
は empty WindowsIdentity
を使用します。ユーザーが認証されず、User.IsInRoleをチェックしようとすると、Active Directoryに対してWindowsIdentityのロールをチェックしようとします。私が持っていないこと。明らかに、ロールをチェックする前にユーザーがログインしているかどうかを最初にチェックする必要があるため、mea culpaです。
しかし、上記の変更によりコードが修正されたように見えますが、この動作についてもっと知りたいと思っています。なぜ空のSystem.Security.Principal.WindowsIdentity
ユーザーが認証されていない場合。それを説明するどんな答えでも受け入れます。
この問題が発生しました-存在しないActive Directoryグループをテストすると失敗しました。
存在するグループを使用していることを確認してください!
新しい本番サーバーでも同じ問題が発生していました。 Identity Frameworkを使用して、認証されていないユーザーを拒否するweb.configファイルを使用して特定のディレクトリへのアクセスを制限します。認証されていないユーザーがUser.IsInRole("RoleName")
コードを含むこのディレクトリのページにアクセスしようとすると、「信頼関係...」エラーが発生していました。
他のSOの回答に記載されている修正はいずれも機能しませんでした。
IIS-問題解決済みでフォーム認証を有効にする必要がありました。
「プライマリドメインとワークステーション間の信頼関係が失敗しました」というエラーメッセージは、通常、 コンピューターをドメインから削除してから再参加する が必要です。これを行うにはいくつかの方法があります。上記のリンクに含まれているように、エラーを表示しているコンピューター上で、またはリモートで行う方法に関する指示があります。 Active DirectoryおよびPowerShellでも実行できます。
システムでこれを解決しましたが、残念ながら、他の提案はどれもうまくいきませんでした。この問題は、コードがアクセスしようとしたネットワークフォルダー内の孤立したSIDが原因で発生しました。削除すると、再び機能し始めました。
私にとっては、メンバーシッププロバイダーの構成タグ全体がありませんでした。以前のアプリからそれらをコピーした後、うまくいきました。
<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>
<authorization>
<allow roles="pri\Domain Users" users="pri\domain_user" />
<deny users="?" />
</authorization>
カスタム認証モジュールを使用した場合とまったく同じシナリオで、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>
それは私のためにトリックをしました!