Мой Google foo действительно слаб. Ответ прямо позади ссылки в моем вопросе. Итак, вот несколько ссылок на this blog в случае, если кто-то имеет тот же вопрос в конце концов.
Во-первых, вы должны попытаться понять "которые утверждают, набор вещей":
Тогда вы должны знать, где наборы претензии приходят от:
Вооружившись этим знанием, он фактически становится довольно просто.
Если я правильно понимаю, основной рабочий процесс будет что-то вроде этого:
- Клиент создает
SecurityToken
с использованием SecurityTokenProvider
- Client Сериализует
SecurityToken
с использованием SecurityTokenSerializer
- Сервер десериализует
SecurityToken
с помощью a SecurityTokenSerializer
- Сервер создает
IAuthorizationPolicy
с использованием SecurityTokenAuthenticator
- Сервер создает
AuthorizationContext
из IAuthorizationPolicy
с
- Совершено
Пример:
// 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
сек работает как шарм (не пробовал десериализации), но WindowsSecurityToken
s, по-видимому, не поддерживается сериализатором. Это оставляет мне два метода проверки подлинности, которые у меня уже есть (сертификаты и имя пользователя/пароль), и, поскольку я не хотел, чтобы AuthorizationContext
в любом случае, я буду придерживаться того, что у меня есть :)
В случае, если кто-либо заинтересован, я не уверен, что SecurityToken должен быть создан на стороне клиента и передан на сервер. Для обеспечения безопасности X.509 имеет смысл инициировать SslStream с сервером и создавать X509SecurityToken из сертификата сервера, для обеспечения безопасности Windows WindowsSecurityToken может быть создан из negotiateStream.RemoteIdentity, если используется NegotiateStream. Для безопасности имени пользователя и пароля, конечно, необходимо будет указать имя пользователя и пароль. – dtb