Ответ 1
Мой Google foo был действительно слабым. Ответ прямо позади ссылки в моем вопросе. Итак, вот несколько ссылок на этот блог, если кто-то имеет тот же вопрос в конце концов.
Во-первых, вы должны попытаться понять "этот набор требований":
- Claims
- Наборы претензий
- Проверка наборов претензий
- Windows и X509Certificate Claim Sets
- Типичные операции над наборами требований
Затем вам нужно знать, откуда возникают претензии:
- Политика авторизации, преобразование контекста и претензий
- Преобразование требований в WCF
- Трансформация полномочий и преобразование претензий вне WCF
Вооружившись этим знанием, он становится довольно простым.
Если я правильно ее понимаю, основной рабочий процесс будет примерно таким:
- Клиент создает
SecurityToken
с помощьюSecurityTokenProvider
- Клиент выполняет сериализацию
SecurityToken
с помощьюSecurityTokenSerializer
- Сервер десериализует
SecurityToken
с помощьюSecurityTokenSerializer
- Сервер создает
IAuthorizationPolicy
с помощьюSecurityTokenAuthenticator
- Сервер создает
AuthorizationContext
изIAuthorizationPolicy
s - Готово
Пример:
// Create the SecurityTokenProvider
var p = new UserNameSecurityTokenProvider("username", "password");
// Get the SecurityToken from the SecurityTokenProvider
var t = p.GetToken(TimeSpan.FromSeconds(1.0)) as UserNameSecurityToken;
// ... transmit SecurityToken to server ...
// Create the SecurityTokenAuthenticator
var a = new CustomUserNameSecurityTokenAuthenticator(
UserNamePasswordValidator.None);
// Create IAuthorizationPolicies from SecurityToken
var i = a.ValidateToken(t);
// Create AuthorizationContext from IAuthorizationPolicies
var c = AuthorizationContext.CreateDefaultAuthorizationContext(i);
ShowClaims(c.ClaimSets);
Для X509SecurityToken
используйте X509SecurityTokenProvider
/Authenticator
. Для WindowsSecurityToken
существует a WindowsSecurityTokenAuthenticator
, но не поставщик; вместо этого используйте конструктор WindowsSecurityToken
:
var t = new WindowsSecurityToken(WindowsIdentity.GetCurrent());
Это работает довольно хорошо. Единственное, что я пропустил выше, это сериализация маркера. Существует класс SecurityTokenSerializer
, который имеет одну реализацию в .NET framework: класс WSSecurityTokenSerializer
, который поставляется с WCF.
Сериализация UserNameSecurityToken
и X509SecurityToken
работает как шарм (не пробовали десериализацию), но WindowsSecurityToken
, по-видимому, не поддерживается сериализатором. Это оставляет мне два метода проверки подлинности, которые у меня уже есть (сертификаты и имя пользователя/пароль), и, поскольку я не хотел, чтобы это AuthorizationContext
в любом случае, я буду придерживаться того, что у меня есть:)