Как получить пользовательское имя пользователя / пароль в WCF - PullRequest
1 голос
/ 23 мая 2011

Я использую clientCredentailType в качестве имени пользователя в режиме безопасности в разделе Сообщение. Я создал класс проверки имени пользователя и пароля для проверки имени пользователя и пароля.

Я хочу использовать эти учетные данные (имя пользователя, пароль) для авторизации для различных операций в службе. Я хочу знать, как лучше хранить имя пользователя и пароль для повторного использования. Должен ли я использовать свой собственный класс валидатора, чтобы хранить их в статических переменных, чтобы они были доступны везде?

Почему я не могу использовать System.Threading.Thread.CurrentPrincipal.Identity.Name, я пытался получить имя пользователя, но он ничего не показывает, и как я могу получить пароль?

Спасибо Аднан

Ответы [ 2 ]

1 голос
/ 23 мая 2011

Только обрабатывайте и используйте учетные данные в вашем пользовательском валидаторе.Если учетные данные действительны, используйте настраиваемую политику авторизации, чтобы подготовить настраиваемого участника с набором ролей для этого пользователя и украсить свои методы обслуживания с помощью атрибутов PrincipalPermission.

[PrincipalPermission(SecurityAction.Demand, Authenticated = true, Role = "ClearedForUsingFoo")]
public void Foo(string bar)
{
...


class AuthorizationPolicy : IAuthorizationPolicy
{
    public bool Evaluate(EvaluationContext evaluationContext, ref object state)
    {
        // get the authenticated client identity
        IIdentity identity = GetClientIdentity(evaluationContext);

        // set the custom principal
        evaluationContext.Properties["Principal"] = new CustomPrincipal(identity);

        return true;
    }

    public ClaimSet Issuer
    {
        get { throw new NotImplementedException(); }
    }

    public string Id
    {
        get { return "FooBarApp.AuthorizationPolicy"; }
    }

    private static IIdentity GetClientIdentity(EvaluationContext evaluationContext)
    {
        object obj;
        if (!evaluationContext.Properties.TryGetValue("Identities", out obj))
            throw new Exception("No Identity found");

        IList<IIdentity> identities = obj as IList<IIdentity>;
        if (identities == null || identities.Count <= 0)
            throw new Exception("No Identity found");

        return identities[0];
    }
}
0 голосов
/ 23 мая 2011

Свойство CurrentPrincipal потока - это идентификатор Windows, под которым работает служба .Ваша служба получает идентификационную информацию client в форме имени пользователя / пароля и не имеет отношения к идентификатору службы.WCF поддерживает олицетворение и делегирование , но не использует собственную схему идентификации, которую использует ваша служба.

Принятый ответ на этот вопрос может быть тем, что вы ищете.Если это не сработает, это довольно уродливо и быстро сделать это вручную в коде.

...