Мой Google Foo был действительно слабым. Ответ прямо за ссылкой в моем вопросе. Вот пара ссылок на этот блог на случай, если у кого-нибудь возникнет тот же вопрос.
Во-первых, вы должны попытаться понять, "что такое набор утверждений":
Затем вам нужно знать, откуда берутся заявки:
Вооружившись этим знанием, оно на самом деле становится довольно простым.
Если я правильно понимаю, основной рабочий процесс будет выглядеть примерно так:
- Клиент создает
SecurityToken
, используя SecurityTokenProvider
- Клиент сериализует
SecurityToken
, используя SecurityTokenSerializer
- Сервер десериализует
SecurityToken
, используя SecurityTokenSerializer
- Сервер создает
IAuthorizationPolicy
с использованием SecurityTokenAuthenticator
- Сервер создает
AuthorizationContext
из IAuthorizationPolicy
s
- Готово
* 1 072 * Пример:
// 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
s используйте X509SecurityTokenProvider
/ Authenticator
. Для WindowsSecurityToken
s есть WindowsSecurityTokenAuthenticator
, но нет поставщика; вместо этого используйте конструктор WindowsSecurityToken
:
var t = new WindowsSecurityToken(WindowsIdentity.GetCurrent());
Это работает довольно хорошо. Единственное, что я опускал до сих пор, это сериализация токена. Существует класс SecurityTokenSerializer
, который имеет одну реализацию в .NET Framework: класс WSSecurityTokenSerializer
, который поставляется с WCF.
Сериализация UserNameSecurityToken
s и X509SecurityToken
s работает как брелок (не пробовал десериализацию), но WindowsSecurityToken
s, очевидно, не поддерживаются сериализатором. Это оставляет меня с двумя методами аутентификации, которые у меня уже есть (сертификаты и имя пользователя / пароль), и, так как я не хотел этого AuthorizationContext
в любом случае, я буду придерживаться того, что имею:)