У меня есть приложение ASP.NET 4.0, в котором мне нужно перенаправить аутентификацию в базу данных. Для целей этого запроса на помощь вы можете вызвать веб-сервер "app1" и сервер базы данных "sql1".
Служба базы данных SQL2008R2 работает как именованный экземпляр "SQL2008R2" под учетной записью пользовательского домена "SqlServer". Сервер работает под управлением Windows Server 2008 R2 Enterprise Edition. Я создал SPN для этого...
setspn -a MSSQLSvc/sql1.mydomain.local:SQL2008R2 SqlServer
Приложение ASP.NET работает под пулом приложений, используя специальную учетную запись домена "WebApplicationUser" в режиме Integrated Pipeline. В настоящее время он работает на моем ноутбуке под управлением Windows 7 Enterprise, но в конечном итоге будет размещен в Windows Server 2008 R2 Standard Edition. Я создал 2 SPN для приложения (на машине Windows 7, в которой я сейчас запущен)...
setspn -a http/app1 WebApplicationUser
setspn -a http/app1.mydomain.local WebApplicationUser
Внутри пользователей Active Directory и компьютеров я выбрал учетную запись "WebApplicationUser", и я включил принудительное делегирование в "MSSQLSvc/sql1.mydomain.local: SQL2008R2" с использованием любого протокола (я также пытался использовать только Kerbero).
Приложение настроено в IIS 7.5, и для аутентификации установлено запрещение Anonymouse, Basic, Digest и Forms при включении "олицетворения ASP.NET" и "Windows". Аутентификация Windows отключена "Расширенная защита" и включена "Проверка подлинности в режиме ядра". В этом порядке провайдеры "Negotiate" и "NTLM".
Приложение ASP.NET использует EF, а строка подключения настроена на использование встроенной безопасности...
<connectionStrings>
<add name="MyContext"
connectionString="metadata=res://*/Data.MyModel.csdl|res://*/Data.MyModel.ssdl|res://*/Data.MyModel.msl;provider=System.Data.SqlClient;provider connection string="Data Source=sql1.mydomain.local\sql2008r2;Initial Catalog=MyDatabase;Persist Security Info=false;Integrated Security=True;MultipleActiveResultSets=True""
providerName="System.Data.EntityClient" />
</connectionStrings>
Мой веб-конфигуратор определяет как проверку подлинности Windows, так и олицетворение, так как я использую async-страницы, я также включил политику inpersonation...
<runtime>
<alwaysFlowImpersonationPolicy enabled="true" />
</runtime>
<system.web>
<authentication mode="Windows" />
<identity impersonate="true" />
</system.web>
Если я вхожу локально (на "web1" ) и просматриваю приложение (используя IE), все это работает, но это не связано с двойным прыжком, который я пытаюсь разрешить.
Если я войду на другой компьютер, а затем перейду к приложению с помощью IE, или я просмотрю с локального компьютера с помощью FireFox, это не сработает - обратите внимание: FireFox запрашивает данные для входа. При соединении с базой данных "Ошибка входа в систему для пользователя" NT AUTHORITY\ANONYMOUS LOGON "
В отличие от многих статей (и здесь может быть частью проблемы), я не использую какой-либо пользовательский код для олицетворения пользователя. Я понимаю, что олицетворение будет применяться по всем направлениям к приложению с помощью настроек web.config выше. Все, что я делаю, - это открыть соединение, а затем закрыть его, когда я закончу его.
Я, очевидно, пропустил шаг (или два), но, посмотрев всю документацию, которую я могу найти (и там было много), я все еще не могу найти, что это за шаг. Это не помогает тому, что 99% документации, которую я могу найти, фактически связаны с IIS6 и Windows 2003, но принципы должны оставаться теми же.
Кто-нибудь преуспел в том, чтобы настроить такую конфигурацию на Windows 7 и/или Windows Server 2008?