Как я могу использовать проверку подлинности Windows с ролями, которые будут храниться в базе данных Oracle? [Дубликат]

Я хотел бы добавить одну вещь к отличному ответу chazomaticus :

Не забудьте также тег META (например, или HTML4 или XHTML-версия этого файла ):


Это кажется тривиальным, но IE7 дал мне проблемы с этим раньше.

Я делал все правильно; база данных, соединение с базой данных и HTTP-заголовок Content-Type были настроены на UTF-8, и она отлично работала во всех других браузерах, но Internet Explorer по-прежнему настаивал на использовании «западноевропейской» кодировки.

It оказалось, что на странице отсутствует метка META. Добавление этого решения проблемы.

Правка:

У W3C фактически есть довольно большой раздел , посвященный I18N . У них есть ряд статей, связанных с этой проблемой & ndash; описывая HTTP, (X) HTML и CSS сторону вещей:

Они рекомендуют использовать как HTTP-заголовок, так и HTML метатег (или объявление XML в случае XHTML служил XML).

20
задан John 3 June 2013 в 20:45
поделиться

2 ответа

У меня все работает сейчас, вот как я это сделал:

На этой странице: http://msdn.microsoft.com/en-us/library/ee517293. aspx Являлся ключевым пунктом:

Если вы хотите, чтобы ваши заявления об использовании приложений RP, но у вас нет STS (например, RP использует проверку подлинности с помощью форм или Windows интегрированная проверка подлинности), вы можете использовать модуль ClaimsPrincipalHttpModule. Этот модуль находится в конвейере HTTP вашего приложения и перехватывает информацию аутентификации. Он генерирует IClaimsPrincipal для каждого пользователя на основе имени пользователя, членов группы и другой информации аутентификации. ClaimsPrincipalHttpModule должен быть вставлен в конец конвейера <httpModules>, который является первым элементом в секции <modules> в <system.webServer> в IIS 7.

И эта страница:

http://leastprivilege.com/2012/04/04/identity-in-net-4-5part-2-claims-transformation-in-asp-net-beta-1/

Дает вам весь класс. Теперь добавьте этот класс в web.config:

<modules>
  <add name="ClaimsTransformationHttpModule" type="TestSecurity.ClaimsTransformationHttpModule" />
</modules>

Теперь он вызовет преобразование, и я смогу удалить метод проверки подлинности post в global.asax.

В методе проверки подлинности , Я вызываю это, чтобы установить файл cookie:

private void CreateSession(ClaimsPrincipal transformedPrincipal)
{
    SessionSecurityToken sessionSecurityToken = new SessionSecurityToken(transformedPrincipal, TimeSpan.FromHours(8));
    FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionSecurityToken);
}

Модуль из ранее уже настроен, чтобы просмотреть его и пропустить аутентификацию, если он присутствует.

Наконец, для безопасного обращения ошибка, которую я продолжал получать. Я не совсем уверен в этой причине, но я обнаружил, что если я изменил принципала, который будет передан в Authenticate, а затем вернет его (это то, что он показывает в msdn), тогда ошибка будет отображаться во всех последующих запросах. Однако, если я создал и вернул новый принципал, это не произойдет. Это также оказывается полезным для отказа от претензий, которые вам не нужны.

List<Claim> newClaims = new List<Claim>();

var keeper = ((ClaimsIdentity)incomingPrincipal.Identity).Claims.First(c =>
    c.Type == ClaimTypes.Name);
newClaims.Add(keeper);

ClaimsIdentity ci = new ClaimsIdentity(newClaims, "Negotiate");

return new ClaimsPrincipal(ci);

Итак, теперь я могу проверить подлинность Windows, ввести пользовательские требования и их кэшировать с помощью файла cookie. Надеюсь, это поможет любому, кто пытается сделать то же самое, и если я не буду делать что-то правильно, дайте мне знать.

19
ответ дан John 28 August 2018 в 03:10
поделиться

Этот ответ призван дать дальнейшее разъяснение в ответ Джона выше, после нескольких неудачных попыток решить некоторые подобные проблемы.

1. ClaimsPrincipalHttpModule

Как выяснил Джон, если вы используете Windows Auth или Forms Auth, ASP.NET не будет автоматически вызывать ваш ClaimsAuthenticationManager (это не федеративный сценарий). Вы должны сделать это самостоятельно после того, как ASP.NET выполнила аутентификацию пользователя. Использование модуля ClaimsPrincipalHttpModule, который раньше был частью IdentityModel, эффективно обеспечит это.

Однако будьте осторожны с использованием этого модуля. Он был удален по какой-то причине. Моя теория о том, почему она была удалена из IdentityModel, заключается в том, что она не играет хорошо, если вы размещаете службы WCF в своем приложении ASP.NET и имеете aspNetCompatibilityEnabled = true. Это приведет к поломке вашей проверки подлинности WCF (модуль будет выполняться перед конвейером WCF, и мой опыт в том, что ваши клиенты WCF больше не смогут правильно аутентифицироваться - я это подтвердил при использовании Windows Auth).

Если вы размещаете службы WCF в этом сценарии, вы должны как-то убедиться, что ClaimsAuthenticationManager вызывается только для запросов, не связанных с WCF. Для запросов WCF, похоже, для этого нужно полагаться на конвейер WCF (<serviceCredentials useIdentityConfiguration="true" />). Самое простое решение - просто отключить aspNetCompatibilityEnabled. Если это не вариант, вы не должны использовать ClaimsPrincipalHttpModule, но должны каким-то образом изучить входящий запрос и только вызвать ClaimsAuthenticationManager, если запрос не предназначен для WCF.

2. Ошибка дескриптора (ObjectDisposedException)

Это происходит, если вы создаете SessionSecurityToken, основанный на WindowsIdentity. Модуль SessionAuthenticationModule имеет специальную логику для обработки заявлений WindowsIdentity, прочитанных с SessionSecurityToken, и попытается повторно связать WindowsIdentity с использованием данных, которые более недействительны. (Я не уверен в обстоятельствах, в которых он будет работать, но он постоянно проваливался во всех сценариях, которые я тестировал). Таким образом, как пояснил Джон, урок состоит в том, что при попытке использовать WIF с Windows auth SessionSecurityTokens не следует создавать из WindowsPrincipal (или, вернее, WindowsIdentity). Любой другой тип преобразованных ClaimsPrincipal должен быть точным.

10
ответ дан Phil Degenhardt 28 August 2018 в 03:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: