Добавление ролей, извлеченных из SQL Server в качестве утверждений, в доверие проверяющей стороне AD FS - PullRequest
0 голосов
/ 21 мая 2018

Я аутентифицирую пользователей веб-сайта mvc asp.net с помощью пассивного перенаправления ADFS Server 2016, и я не могу получить утверждения из хранилища атрибутов SQL.Мне интересно узнать, что я делаю неправильно или отсутствует.

Примечание: я использую библиотеки System.Identity из Framework 4.5 (я не ссылаюсь на Microsoft.Библиотеки удостоверений, созданные для более старых версий платформы; большинство примеров кода ADFS, с которыми я сталкиваюсь, используют эти старые библиотеки.

Основы работают хорошо.Все это в одном домене.У меня есть asp.net web.config, настроенный для перенаправления пользователей на мой сервер ADFS для аутентификации.Сервер ADFS успешно аутентифицирует и перенаправляет пользователей обратно на мой сайт asp.net.В ADFS у меня есть одно правило политики выдачи претензий, в котором я просто передаю все заявки из Active Directory.

На веб-сайте я могу перебирать коллекцию заявок пользователя и отображать их.Вот код со страницы * .cshtml, где я выполняю итерации, несмотря на утверждения, он отлично работает:

@using System.Security.Claims;
@{
var currentPrincipalIdentity = (ClaimsIdentity)System.Threading.Thread.CurrentPrincipal.Identity;
}
@foreach (Claim claim in currentPrincipalIdentity.Claims)
{
    <br/>@claim.Type : @claim.Value
}

В дополнение к этим утверждениям из Active Directory, я хочу получить набор ролей из SQLБаза данных сервера и добавление их в коллекцию заявок в качестве ролей.Я выбираю роли из устаревшей базы данных членства asp.net.На шаге 1 я просто хочу жестко закодировать имя пользователя в операторе SQL (в конце концов мне нужно будет выяснить, как передать имя пользователя в качестве параметра в оператор SQL, но это будет шаг 2).

Сначала я дал удостоверение, что сервер ADFS работает с разрешениями на чтение / запись / выполнение на моем SQL Server (когда я убираю эти разрешения, я получаю ошибку разрешений, которая дает мне уверенность в том, что мой оператор SQLвыполняется).

В своей AD FS я добавил хранилище атрибутов SQL Server, щелкнув правой кнопкой мыши узел «Хранилища атрибутов», выбрав тип хранилища атрибутов «SQL», названный «SQLServer», и добавилСтрока подключения выглядит следующим образом:

Server=SqlDev01; Database=MyLegacyMembershipDatabase; Integrated Security=SSPI;

Затем я выбираю папку «Доверие проверяющей стороны», выбираю интересующее меня доверие и выбираю «Изменить политики выдачи утверждений».У меня есть одно правило, которое работает;он просто передает все утверждения Active Directory.Я вижу все эти утверждения на моей веб-странице (имя, имя, имя пользователя windowsaccount, все sids моей группы и т. Д.):

c:[]
 => issue(claim = c);

Я пытаюсь добавить второе пользовательское правило для чтенияустаревшая база членства.В моей ADFS я нажимаю «Добавить правило», «Отправить заявку с использованием пользовательского правила» и добавляю это как правило:

c:[Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn"]
 => add(store = "SQLServer", types = 
("http://schemas.microsoft.com/ws/2008/06/identity/claims/role"), query = 
"select r.RoleName AS Role from dbo.aspnet_Roles r INNER JOIN 
dbo.aspnet_UsersInRoles uir ON r.RoleId = uir.RoleId INNER JOIN 
dbo.aspnet_Users u ON uir.UserId = u.UserId WHERE u.UserName = '[hard-coded 
value here]' OR u.UserName={0}", param = c.Value);

Сохраняется нормально, но при повторном запуске страницы ничего не меняется;Я все еще получаю оригинальную коллекцию утверждений Active Directory, но не данные от SQL Server.

Я уверен, что оператор SQL Server выполняется, потому что, если я удаляю разрешения для удостоверения, под которым работает ADFS, из SQL Server, я получаю ошибку, и если я намеренно искажаю синтаксис SQL, я получаю ошибку.Если я исправлю эти преднамеренные ошибки, то страница снова будет работать правильно.Но я никогда не вижу ролей, которые хочу видеть в коллекции утверждений.

Из моего понимания пользовательских правил "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn" передается в качестве параметра в запрос, поэтому я имеюприведенное выше утверждение ИЛИ; моя конечная цель - передать имя пользователя в качестве параметра в запрос SQL.

Я что-то упускаю или делаю что-то не так? Дополнительный вопрос - предположим, у меня все получилось, вы можете сказать,Как передать имя пользователя в качестве параметра в запрос SQL?

1 Ответ

0 голосов
/ 11 июня 2018

Попробуйте правило «эмиссии», а не «добавление».

...