将项目迁移到 MVC5 后声明出现问题,意外调用 GetRolesForUser
Issue with Claims after migrating project to MVC5, unexpected call to GetRolesForUser
一个项目已从 MVC 4 更新到 MVC 5,因为新使用了 Visual Studio 2015,它没有正确编译 razor 视图(这是 Microsoft 记录的内容,而不是问题)。
我们使用跨项目的实用程序 class 来检索存储在 Identity Claims 中的值。
在那 class 中,有人打电话给:
System.Security.Claims.ClaimsPrincipal.Current.Claims.ToList()
它在之前的 MVC4 版本中工作,但是在迁移了 MVC5 所需的所有 Nuget 包之后,这个特定的调用抛出了以下错误:
An exception of type 'System.ArgumentNullException' occurred in System.Web.Providers.dll but was not handled in user code
Value cannot be null.
Parameter name : username
System.Web.Providers.DefaultRoleProvider.GetRolesForUser(String
username) +183 System.Web.Security.RolePrincipal.GetRoles() +215
System.Web.Security.d__1.MoveNext() +58
System.Security.Claims.d__1.MoveNext() +253
System.Security.Claims.d__1.MoveNext() +209
System.Collections.Generic.List1..ctor(IEnumerable
1 collection) +445
System.Linq.Enumerable.ToList(IEnumerable`1 source) +58
我在该集合上执行了一个 foreach(),这就像在所有自定义声明之后它到达了一个意想不到的终点,或者它试图从 GetRoleForUser 中检索东西但我不知道为什么。
如果有人有提示,我可以根据需要提供更多详细信息。
该 MVC 项目的 Web.Config 设置:
<modules>
<add name="WSFederationAuthenticationModule" type="System.IdentityModel.Services.WSFederationAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
<add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
<add name="ClaimsAuthorizationModule" type="System.IdentityModel.Services.ClaimsAuthorizationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
<remove name="FormsAuthentication" />
</modules>
....
<system.identityModel>
<identityConfiguration>
<audienceUris>
<add value="http://localhost:58663/" />
</audienceUris>
<securityTokenHandlers>
<add type="System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</securityTokenHandlers>
<certificateValidation certificateValidationMode="None" />
<issuerNameRegistry type="System.IdentityModel.Tokens.ValidatingIssuerNameRegistry, System.IdentityModel.Tokens.ValidatingIssuerNameRegistry">
<authority name="QuadraSTS">
<keys>
<add thumbprint="XXXHIDDENXXX" />
</keys>
<validIssuers>
<add name="QuadraSTS" />
</validIssuers>
</authority>
</issuerNameRegistry>
<claimsAuthorizationManager type="ClaimsBasedAuthorization.AuthorizationManager,QuadraBox" />
</identityConfiguration>
</system.identityModel>
<system.identityModel.services>
<federationConfiguration>
<cookieHandler requireSsl="false" persistentSessionLifetime="1.0:0:0" path="/" />
<wsFederation passiveRedirectEnabled="true" persistentCookiesOnPassiveRedirects="true" issuer="http://something:97/QuadraSTSBeta/" realm="http://localhost:58663/" requireHttps="false" />
</federationConfiguration>
</system.identityModel.services>
问题主要是由 WebMatrix Data 不正确地尝试加载用户角色引起的。
因为在项目中没有用到,也没有理由出现在这个项目中,所以决定去掉。
卸载 WebMatrix nuget,并删除项目中对 WebMatrix 的所有引用解决了该问题。
一个项目已从 MVC 4 更新到 MVC 5,因为新使用了 Visual Studio 2015,它没有正确编译 razor 视图(这是 Microsoft 记录的内容,而不是问题)。 我们使用跨项目的实用程序 class 来检索存储在 Identity Claims 中的值。
在那 class 中,有人打电话给:
System.Security.Claims.ClaimsPrincipal.Current.Claims.ToList()
它在之前的 MVC4 版本中工作,但是在迁移了 MVC5 所需的所有 Nuget 包之后,这个特定的调用抛出了以下错误:
An exception of type 'System.ArgumentNullException' occurred in System.Web.Providers.dll but was not handled in user code
Value cannot be null.
Parameter name : username
System.Web.Providers.DefaultRoleProvider.GetRolesForUser(String username) +183 System.Web.Security.RolePrincipal.GetRoles() +215
System.Web.Security.d__1.MoveNext() +58
System.Security.Claims.d__1.MoveNext() +253
System.Security.Claims.d__1.MoveNext() +209
System.Collections.Generic.List1..ctor(IEnumerable
1 collection) +445 System.Linq.Enumerable.ToList(IEnumerable`1 source) +58
我在该集合上执行了一个 foreach(),这就像在所有自定义声明之后它到达了一个意想不到的终点,或者它试图从 GetRoleForUser 中检索东西但我不知道为什么。
如果有人有提示,我可以根据需要提供更多详细信息。
该 MVC 项目的 Web.Config 设置:
<modules>
<add name="WSFederationAuthenticationModule" type="System.IdentityModel.Services.WSFederationAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
<add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
<add name="ClaimsAuthorizationModule" type="System.IdentityModel.Services.ClaimsAuthorizationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
<remove name="FormsAuthentication" />
</modules>
....
<system.identityModel>
<identityConfiguration>
<audienceUris>
<add value="http://localhost:58663/" />
</audienceUris>
<securityTokenHandlers>
<add type="System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</securityTokenHandlers>
<certificateValidation certificateValidationMode="None" />
<issuerNameRegistry type="System.IdentityModel.Tokens.ValidatingIssuerNameRegistry, System.IdentityModel.Tokens.ValidatingIssuerNameRegistry">
<authority name="QuadraSTS">
<keys>
<add thumbprint="XXXHIDDENXXX" />
</keys>
<validIssuers>
<add name="QuadraSTS" />
</validIssuers>
</authority>
</issuerNameRegistry>
<claimsAuthorizationManager type="ClaimsBasedAuthorization.AuthorizationManager,QuadraBox" />
</identityConfiguration>
</system.identityModel>
<system.identityModel.services>
<federationConfiguration>
<cookieHandler requireSsl="false" persistentSessionLifetime="1.0:0:0" path="/" />
<wsFederation passiveRedirectEnabled="true" persistentCookiesOnPassiveRedirects="true" issuer="http://something:97/QuadraSTSBeta/" realm="http://localhost:58663/" requireHttps="false" />
</federationConfiguration>
</system.identityModel.services>
问题主要是由 WebMatrix Data 不正确地尝试加载用户角色引起的。
因为在项目中没有用到,也没有理由出现在这个项目中,所以决定去掉。
卸载 WebMatrix nuget,并删除项目中对 WebMatrix 的所有引用解决了该问题。