我有一个ASP .NET MVC5应用程序,我使用Windows身份验证不。
一切正常,直到我尝试在开发它的域之外运行应用程序(无论出于何种原因)得到了:
The trust relationship between this workstation and the primary domain failed.
当我试图User.IsInRole("Admin")
时。
我正在使用来自.NET Identity
的自定义Identity
,Role
,IdentityStore
,RoleStore
等等,我可以看到正在从(MongoDB)数据库中正确检索用户和角色数据。
关于此问题有很多问题,但是他们来自想要使用Windows Auth的人。和冒充他们的MVC应用程序:
How to configure Windows Authentication / Impersonation + IIS 7 + MVC
The trust relationship between the primary domain and the trusted domain failed
My.User.IsInRole("Role Name") throws a Trust Relationship error on Windows 7
那么,如果我没有使用Active Directory并且(据我所知)没有做任何可能取决于PC域的事情,为什么我得到这个SystemException
呢?我错过了一些配置(在我的Web.config
或IIS Express中)?
好的,所以缩小了一点......
我的User.IsInRole("Admin")
行位于if()
视图中的_Layout.cshtml
语句内(即,根据角色了解导航栏中显示的内容)。
我现在知道,当没有用户通过身份验证时,我只会收到上述错误,而且我不在我用于开发的域中。如果我在该行上放置断点,我可以看到User
对象是System.Security.Principal.WindowsIdentity
,其基础Identity
是System.Security.Principal.WindowsIdentity
。
另一方面,如果用户通过身份验证,则User
对象和ts Identity
为System.Security.Claims.ClaimsPrincipal
和System.Security.Claims.ClaimsIdentity
。
为什么它完全使用Windows身份(未经身份验证时)以及如何禁用它?
答案 0 :(得分:27)
所以,基于我的编辑,我已经修改了我的_Layout.cshtml
,而不是
@if(User.IsInRole("Admin")) {...}
我有
@if(User.Identity.IsAuthenticated && User.IsInRole("Admin")) {...}
似乎解决了这个问题。
我认为问题是ASP .NET Identity
在没有用户通过身份验证时使用empty WindowsIdentity
,当我尝试检查User.IsInRole时,它会尝试检查WindowsIdentity的角色我没有的Active Directory。显然我应首先检查用户是否在尝试检查其角色之前是否已登录,因此 mea culpa 。
但是,即使上面的更改似乎修复了我的代码,我也非常有兴趣了解有关此行为的更多信息:为什么在没有用户通过身份验证时使用空System.Security.Principal.WindowsIdentity
。我会接受任何解释这个问题的答案。
答案 1 :(得分:5)
我有这个问题 - 如果我测试了一个不存在的活动目录组,那对我来说就失败了。
确保您使用的是存在的群组!
答案 2 :(得分:0)
主域和工作站之间的信任关系失败了"错误消息美国需要computer be removed from the domain and then rejoined。现在有几种方法可以做到这一点。如上面的链接所示,有关如何在显示错误的计算机上或远程执行此操作的说明。您也可以在Active Directory和PowerShell中执行此操作。
答案 3 :(得分:0)
<authorization>
<allow roles="pri\Domain Users" users="pri\domain_user" />
<deny users="?" />
</authorization>
答案 4 :(得分:0)
我们在新的生产服务器上遇到了同样的问题。使用Identity Framework并使用web.config文件限制对特定目录的访问,从而拒绝任何未经身份验证的用户。当未经身份验证的用户尝试访问此目录中包含任何User.IsInRole("RoleName")
代码的页面时,他们会收到“信任关系...”错误。
其他SO答案中提到的修复都没有为我们工作。
原来我们只需要在IIS中启用表单身份验证 - 问题就解决了。
答案 5 :(得分:0)
我刚刚在我们的系统中解决了这个问题,遗憾的是,没有其他建议对我有用。该问题是由代码尝试访问的网络文件夹中的孤立SID引起的。一旦删除它就会重新开始工作。
答案 6 :(得分:0)
我在使用自定义身份验证模块时遇到完全相同的情况,并且在执行IsInRole时出现相同的错误。排名最高的解决方案(User.Identity.IsAuthenticated&amp;&amp; ...)没有帮助。所以,我玩了很多。最后我发现我必须从web.config文件中的模块声明中删除(preCondition =&#34; managedHandler&#34;)属性。所以,而不是:
<system.webServer>
...
<modules>
...
<add name="CompanyAuthentication" type="Company.Authentication.AuthHttpHandler" preCondition="managedHandler" />
</modules>
我必须:
<system.webServer>
...
<modules>
...
<add name="CompanyAuthentication" type="Company.Authentication.AuthHttpHandler" />
</modules>
这对我有用了!
答案 7 :(得分:0)
对我来说,缺少所有成员资格提供程序配置标签。我从以前的应用程序中复制了这些文件后,效果很好。
<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>
答案 8 :(得分:0)
就我而言,我不是在使用User.Identity
,而是在使用Thread.CurrentPrincipal.Identity.Name
因此,当我处理以下代码行时:
Thread.CurrentPrincipal.IsInRole("admin");
那是我将遇到以下相同错误消息的地方:
The trust relationship between this workstation and the primary domain failed.
在两种情况下,我遇到相同的问题,当然还有我所做的修复:
admin
,它肯定会触发相同的错误消息。 答案 9 :(得分:0)
我在使用Windows身份验证的 Asp.Net Core 3.1遇到了这个问题,但是在搜索Internet时首先出现了该线程。我最终通过以下方式装饰控制器类声明来解决了这个问题:
using Microsoft.AspNetCore.Authorization;
[Authorize]
public class SetupController : Controller
希望这对于正在使用Windows身份验证并且遇到相同错误的人很有帮助。