Я хочу сделать то же самое как в этой ссылке:
http://www.codeproject.com/KB/WCF/Custom_Authorization_WCF.aspx
Но не используя конфигурационные файлы. Кто-либо может показать мне как?
Править: Я хочу реализовать и AuthorizationPolicy и CustomValidator.
Вы имеете в виду, как добавить AuthorizationPolicy через код? Не проверено, но я считаю, что должно сработать что-то вроде этого:
ServiceHost host = ...;
var col = new ReadOnlyCollection<IAuthorizationPolicy>(new IAuthorizationPolicy[] { new MyPolicy() });
ServiceAuthorizationBehavior sa = host.Description.Behaviors.Find<ServiceAuthorizationBehavior>();
if ( sa == null ) {
sa = new ServiceAuthorizationBehavior();
host.Description.Behaviors.Add(sa);
}
sa.ExternalAuthorizationPolicies = col;
Если вы обратитесь к этой теме (Безопасность WCF: получение пароля пользователя) от Рори Примроуза , он достигнет того же, что вы спрашиваете, с предоставлением настраиваемый валидатор, важным методом расширения является CreateSecurityTokenManager
:
public class PasswordServiceCredentials : ServiceCredentials
{
public PasswordServiceCredentials()
{
}
private PasswordServiceCredentials(PasswordServiceCredentials clone)
: base(clone)
{
}
protected override ServiceCredentials CloneCore()
{
return new PasswordServiceCredentials(this);
}
public override SecurityTokenManager CreateSecurityTokenManager()
{
// Check if the current validation mode is for custom username password validation
if (UserNameAuthentication.UserNamePasswordValidationMode == UserNamePasswordValidationMode.Custom)
{
return new PasswordSecurityTokenManager(this);
}
Trace.TraceWarning(Resources.CustomUserNamePasswordValidationNotEnabled);
return base.CreateSecurityTokenManager();
}
}
Чтобы использовать эти учетные данные настраиваемой службы, вам необходимо указать атрибут типа в
] ConfigurationElement
в вашей конфигурации, например:
<serviceCredentials type="your.assembly.namespace.PasswordServiceCredentials,
your.assembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" >
</serviceCredentials>
Точно так же вы можете установить этот атрибут типа
программно, но я не знаю, как это сделать.