Пользовательский ClaimsIdentity вызывает исключение в Entity Framework

  1. В начале конвейера, используя настраиваемый атрибут AuthorizationAttribute, мы устанавливаем Thread.CurrentPrincipal, используя расширенный ClaimsIdentity.

        CustomIdentity identity = new CustomIdentity("Bearer");
        identity.AddClaim(new Claim("customClaim", customClaimValue));
        ...
        ClaimsPrincipal principal = new ClaimsPrincipal(identity);
        Thread.CurrentPrincipal = principal;
    
  2. Позже в конвейере мы пытаемся получить значения из нашей базы данных SQL Server 2012 с помощью EF6.

        var dataList = _repository.GetAll().FirstOrDefault(x => x.Col1 == parameter);
    
  3. Какую версию EF вы используете? EF не имеет ничего общего с субъектом Windows. Одна проблема, о которой я могу думать, заключается в том, что модель на основе EF EDMX не работает правильно, если модель загружается из ссылочной dll. Фактически это ваше приложение, которое не может загрузить сборку в свой appDomain из-за ограничений.

System.Data.Entity.Core.ProviderIncompatibleException: поставщик не вернул экземпляр ProviderManifest

и внутреннее исключение:

Не удалось найти сборку «OurApp.Authorization.Models, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null»

где OurApp.Authorization.Models - это пространство имен и имя проекта, в котором находится CustomIdentity:

namespace OurApp.Authorization.Models
{
[Serializable]
public class CustomIdentity : ClaimsIdentity
{
        ...
}
}

Странно то, что если я устанавливаю Thread.CurrentPrincipal на текущий WindowsIdentity непосредственно перед переходом в хранилище данных, тогда код работает нормально:

Thread.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
var dataList = _repository.GetAll().FirstOrDefault(x => x.Col1 == parameter);

Кажется, что EntityFramework нужно знать о нашем CustomIdentity, но я понятия не имею, почему. Я все равно добавил ссылки в проект доступа к данным, но, похоже, это не повлияло.

Мы убедились, что мы не использовали WindowsAuthentication для доступа к SQL Server, и все наши строки подключения не используют встроенную безопасность, но она по-прежнему не работает.

Кто-нибудь знает, почему установка настраиваемого ClaimsIdentity вызывает это исключение в EntityFramework?

Вот полное исключение по запросу:

Затем мы получаем исключение во время выполнения. Внешнее исключение:


person Emmet    schedule 03.09.2014    source источник
comment
Я думаю, что преждевременно говорить, что EntityFramework нуждается в Thread.CurrentPrincipal, установленном для текущего идентификатора WindowsIdentity. Вероятно, он должен иметь возможность загружать сборку, содержащую Type, который установлен как _1_. Публикация более подробной информации, например полное исключение, включая трассировку стека, может помочь, как и журнал связывания сборки.   -  person Akash Kava    schedule 03.09.2014
comment
Спасибо Акаше и Джо за ваш отзыв. Версия EF - 6.1.1. Да, я думаю, вы правы, что EntityFramework должна иметь возможность загружать сборку, содержащую Type, который установлен в Thread.CurrentPrincipal, нашем CustomIdentity выше. Я просто не знаю, где как это сделать. Than0sk снова.   -  person Joe    schedule 03.09.2014
comment
После дальнейшего поиска я наткнулся на следующие статьи здесь, здесь, здесь. Думаю, я ближе, но решения все еще нет. Я обновился до .Net 4.5.1.   -  person Emmet    schedule 04.09.2014
comment
Я собирался попробовать использовать MarshalByRefObject, чтобы посмотреть, сработает ли это, но мне действительно нужно, чтобы мой CustomIdentity унаследовал от ClaimsIdentity.   -  person Emmet    schedule 04.09.2014
comment
System.Data.Entity.Core.ProviderIncompatibleException не было обработано пользовательским кодом HResult = -2146233087 Сообщение = Поставщик не вернул экземпляр ProviderManifest. Source = EntityFramework StackTrace: в System.Data.Entity.Core.Common.DbProviderServices.GetProviderManifest (String manifestToken) в System.Data.Entity.Utilities.DbConnectionExtensions.GetProviderInfo (соединение DbConnectionExtensions.GetProviderInfo (соединение DbConnection, DbProviderManifest и поставщик System.DbProviderManifest). .Build (DbConnection providerConnection) в System.Data.Entity.Internal.LazyInternalContext.CreateModel (LazyInternalContext internalContext) в System.Data.Entity.Internal.RetryLazy_5_1.Initialize () в System.Data.Entity.Internal.Linq_System.Data.Entity.Internal.Linq .Linq.IQueryable.get_Provider () в System.Linq.Queryable.FirstOrDefault [TSource] (предикат IQueryable_7_1) в OurApp.Module.ViewStore.EntityFramework.InformationViewStore.Get (String userId) в c: \ Code. .ViewStore \ EntityFramework \ InformationViewStore.cs: строка 156 в OurApp.Module.Azure.Api.Hubs.OurAppHub.OnConnected () в c: \ Code \ O urApp \ OurApp.Module.Azure.Api \ Hubs \ ModuleHub.cs: строка 119 в Microsoft.AspNet.SignalR.Hubs.HubDispatcher.Connect (концентратор IHub) в Microsoft.AspNet.SignalR.Hubs.HubPipelineModule. ‹> c__DisplayClass9.b__7 (Концентратор IHub) в Microsoft.AspNet.SignalR.Hubs.HubPipelineModule. ‹> C__DisplayClass9.b__7 (концентратор IHub) в Microsoft.AspNet.SignalR.Hubs.HubPipeline.Connect (концентратор IHub) в Microsoft.AspNet.SignalR.Hubs.HubDispatcher .b__1c (концентратор IHub) в Microsoft.AspNet.SignalR.Hubs.HubDispatcher. ‹> c__DisplayClass33.b__2f (экземпляр IHub) в System.Linq.Enumerable.WhereSelectListIterator_8_1..ctor (источник IEnumerable_9_1) в Microsoft.AspNet.Sign HubDispatcher.ExecuteHubEvent (запрос IRequest, String connectionId, среда Func_10_2) в Microsoft.AspNet.SignalR.Owin.Middleware.HubDispatcherMiddleware.Invoke (контекст IOwinContext) в Microsoft.Owin.Mapping.MapMidwareNeception: time.Serialization.SerializationException HResult = -2146233076 Сообщение = Невозможно найти сборку «OurApp.Authorization.Models, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null». Источник = mscorlib StackTrace: в System.Runtime.Serialization.Formatters. Binary.BinaryAssemblyInfo.GetAssembly () в System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType (BinaryAssemblyInfo assemblyInfo, имя строки) в System.Runtime.Serialization.Formatters.Binary.ObjectMap..ctor (String objectName, String [] memberNames, BinaryTypeEnum [] binaryTypeEnumA, Object [] typeInformationA, Int32 [] memberAssemIds, ObjectReader objectReader, Int32 objectId, BinaryAssemblyInfo assemblyInfo, SizedArray AssemIdToAssemblyTable, SizedArray AssemIdToAssemblyTable в System.Runtime.Serialization. Runtime.Serialization.Formatters.Binary .__ BinaryParser.Run () в System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize (обработчик HeaderHandler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain.MessageTimedCrossSystem.MessageTimedCrossAppDomain. Форматировщики.B inary.BinaryFormatter.Deserialize (Stream serializationStream, обработчик HeaderHandler, логическое значение fCheck, логическое значение isCrossAppDomain, IMethodCallMessage methodCallMessage) в System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (Stream serializationStreamMallModel, обработчик метода HeaderHandle (поток serializationStream), HeaderHandHandler .Security.Claims.ClaimsPrincipal.DeserializeIdentities (Строковые идентификаторы) в System.Security.Claims.ClaimsPrincipal.OnDeserializedMethod (контекст StreamingContext) в System.AppDomain.get_Evidence () в System.AppDomain.Pet_EvfidenceEvidence () в System.AppDomain. (AppDomain appDomain, String exePath, String & typeName) в System.Configuration.ClientConfigPaths.GetTypeAndHashSuffix (AppDomain appDomain, String exePath) в System.Configuration.ClientConfigPaths..ctor (String exePath, Boole includeUserConfig) в System.Configuration.ClientConfigPaths.GetPaths (String exePath, логическое includeUserConfig) в System.Configuration.ClientConfigurationHost.get_ConfigPaths () в System.Configuration.ClientConfigurationHost.RequireCompleteInfit (IInordConfigurationHost.RequireCompleteInfit) (запись IInordGetternal configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object & result, Object & resultRuntimeObject) в System. Configuration.BaseConfigurationRecord.GetSection (String configKey, Boolean getLkg, Boolean checkPermission) в System.Configuration.BaseConfigurationRecord.GetSection (String configKey) в System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigurationSystem.System.Configuration.Internal.IInternalConfigctionSystem. Configuration.ConfigurationManager.GetSection (String sectionName) в System.Xml.XmlConfiguration.XmlReaderSection.get_ProhibitDefaultUrlResolver () в System.Xml.XmlConfiguration.XmlReaderSection.CreateDefaultResolver () в System.Xml.SchemaTableTableTable () в System.Xml.Schema.Parma. , SchemaNames schemaNames, ValidationEventHandler eventHandler) в System.Xml.Schema.XmlSchema.Read (средство чтения XmlReader, ValidationEventHandler validationEventHandler) в System.Xml.Schema.XmlSchema.Read (поток потока, ValidationEventHandler validationEve ntHandler) в System.Data.Entity.Core.SchemaObjectModel.Schema.SomSchemaSetHelper.AddXmlSchemaToSet (XmlSchemaSet schemaSet, XmlSchemaResource schemaResource, HashSet_11_2. ‹> c__Data__Corentity.C__Display.Entvalizer.‹> c__Data__Corent_Class2. (TArg arg) в System.Data.Entity.Core.SchemaObjectModel.Schema.SomSchemaSetHelper.GetSchemaSet (SchemaDataModelOption dataModel) в System.Data.Entity.Core.SchemaObjectModel.Schema.CreateModel.SchemaObjectModel.Schema. .Schema.Parse (XmlReader sourceReader, String sourceLocation) на System.Data.Entity.Core.SchemaObjectModel.SchemaManager.ParseAndValidate (IEnumerable_13_1 sourceFilePaths, SchemaDataModelOption DataModel, AttributeValueNotification providerNotification, AttributeValueNotification providerManifestTokenNotification, providerManifestNeeded providerManifestNeeded, IList_14_1 xmlReaders, IEnumera ble_15_1 & schemaCollection) в System.Data.Entity.Core.SchemaObjectModel.SchemaManager.LoadProviderManifest (XmlReader xmlReader, расположение строки, логическое значение checkForSystemNamespace, Schema & schema) в System.Data.Entity.CoreoMandestxml .Data.Entity.Core.Common.DbXmlEnabledProviderManifest..ctor (средство чтения XmlReader) в System.Data.Entity.SqlServer.SqlProviderManifest. .ctor (String manifestToken) в System.Data.Entity.SqlServer.SqlProviderServices.b__f (String s) в System.Collections.Concurrent.ConcurrentDictionary_16_2 valueFactory) в System.Data.Entity.SqlServer.SqlProviderServices.MetanifestProviderServices.GetDbestPervices. .Data.Entity.Core.Common.DbProviderServices.GetProviderManifest (String manifestToken) InnerException:   -  person Emmet    schedule 04.09.2014