Вы можете создать класс, который реализует IAuthorizationPolicy . WCF анализирует все токены идентификации (X509, имя пользователя / пароль WS-Security и т. Д.) И помещает их вvaluationContext.Properties ["Identities"], который вы получаете в функции Evaluate. Это вернет вам список. Если вы замените этот список списком, содержащим ваш собственный класс, который реализует IIdentity , то WCF прочитает его в ServiceSecurityContext.Current.PrimaryIdentity
. пожалуйста, убедитесь, что список содержит только один элемент, иначе вы перепутаете WCF и PrimaryIdentity.Name
будет пустой строкой.
var myIdentity = new MyIdentity("MyId", otherstuff);
evaluationContext.Properties["Identities"] = new List<IIdentity> {myIdentity};
Кроме того, вы можете захотеть обработать / прочитать любые токены перед их заменой.
var identities = evaluationContext.Properties.ContainsKey("Identities")
? (List<IIdentity>) evaluationContext.Properties["Identities"]
: new List<IIdentity>();
var genericIdentity = identities.Find(x => x.AuthenticationType == "MyUserNamePasswordValidator");
genericIdentity.Name
-> содержит имя пользователя из токена имени пользователя WSS.
Вам понадобится UsernamePasswordValidator (http://msdn.microsoft.com/en-us/library/system.identitymodel.selectors.usernamepasswordvalidator.aspx), если вы используете токен имени пользователя WS-Security и не хотите никакой проверки WCF по умолчанию. Так как у нас есть устройство DataPower, которое проверяет токен до того, как сообщение попадет в наш сервис, нам не нужно проверять имя пользователя и пароль. В нашем случае он просто возвращает true.