В начале конвейера, используя настраиваемый атрибут AuthorizationAttribute, мы устанавливаем Thread.CurrentPrincipal, используя расширенный ClaimsIdentity.
CustomIdentity identity = new CustomIdentity("Bearer"); identity.AddClaim(new Claim("customClaim", customClaimValue)); ... ClaimsPrincipal principal = new ClaimsPrincipal(identity); Thread.CurrentPrincipal = principal;
Позже в конвейере мы пытаемся получить значения из нашей базы данных SQL Server 2012 с помощью EF6.
var dataList = _repository.GetAll().FirstOrDefault(x => x.Col1 == parameter);
- Какую версию 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?
Вот полное исключение по запросу:
Затем мы получаем исключение во время выполнения. Внешнее исключение: