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