“MVC5身份验证中的...与主域之间的信任关系失败”

时间:2014-03-31 15:24:15

标签: asp.net asp.net-mvc asp.net-mvc-5 asp.net-identity

我有一个ASP .NET MVC5应用程序,我使用Windows身份验证

一切正常,直到我尝试在开发它的域之外运行应用程序(无论出于何种原因)得到了:

The trust relationship between this workstation and the primary domain failed.

当我试图User.IsInRole("Admin")时。

我正在使用来自.NET Identity的自定义IdentityRoleIdentityStoreRoleStore等等,我可以看到正在从(MongoDB)数据库中正确检索用户和角色数据。

关于此问题有很多问题,但是他们来自想要使用Windows Auth的人。和冒充他们的MVC应用程序:

那么,如果我没有使用Active Directory并且(据我所知)没有做任何可能取决于PC域的事情,为什么我得到这个SystemException呢?我错过了一些配置(在我的Web.config或IIS Express中)?

编辑:

好的,所以缩小了一点......

我的User.IsInRole("Admin")行位于if()视图中的_Layout.cshtml语句内(即,根据角色了解导航栏中显示的内容)。

我现在知道,当没有用户通过身份验证时,我只会收到上述错误,而且我不在我用于开发的域中。如果我在该行上放置断点,我可以看到User对象是System.Security.Principal.WindowsIdentity,其基础IdentitySystem.Security.Principal.WindowsIdentity

另一方面,如果用户通过身份验证,则User对象和ts IdentitySystem.Security.Claims.ClaimsPrincipalSystem.Security.Claims.ClaimsIdentity

为什么它完全使用Windows身份(未经身份验证时)以及如何禁用它?

10 个答案:

答案 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>
  • 确保您的web.config文件中包含以上行,并使用正确的用户名填写用户字段。

答案 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.

在两种情况下,我遇到相同的问题,当然还有我所做的修复:

  • 我已断开与VPN的连接。这将查找不存在的角色,因为我没有连接到VPN,也没有连接到AD帐户。
  • 如果我连接到我的VPN,但根据上面的代码不存在角色admin,它肯定会触发相同的错误消息。

答案 9 :(得分:0)

我在使用Windows身份验证的 Asp.Net Core 3.1遇到了这个问题,但是在搜索Internet时首先出现了该线程。我最终通过以下方式装饰控制器类声明来解决了这个问题:

using Microsoft.AspNetCore.Authorization;
[Authorize]
    public class SetupController : Controller

希望这对于正在使用Windows身份验证并且遇到相同错误的人很有帮助。