Проект был обновлен с MVC 4 до MVC 5 из-за нового использования Visual Studio 2015, который не компилировал представления бритвы должным образом (что-то, что документировано Microsoft, а не проблема). Мы используем вспомогательные классы для проектов, чтобы получить значения, хранящиеся в Identity Claims.Проблема с претензиями после перенастройки проекта на MVC5, неожиданный вызов GetRolesForUser
В этом классе, кто-то сделали вызов:
System.Security.Claims.ClaimsPrincipal.Current.Claims.ToList()
, который работал в предыдущей версии MVC4, но после переноса всех пакетов NuGet необходимых для MVC5, этот конкретный вызов выдает следующее сообщение об ошибке:
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
Я сделал Еогеасп() на этой коллекции вместо этого, и это, как после все определенных пользовательских претензий он идущий к неожиданному концу, или он пытается извлечь вещи из GetRoleForUser, и я не знаю почему.
Если у кого есть подсказка, я могу предоставить более подробную информацию, если потребуется.
Setup из Web.Config этого проекта MVC:
<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>