Как получить доступ к ClientCredentials с помощью пользовательского IChannel или IChannelFactory? - PullRequest
4 голосов
/ 02 сентября 2011

Я создаю собственный канал в WCF для реализации собственного протокола безопасности. Нет, не убегай! Это не так страшно!

Проверка протокола на сервисе относительно проста. Сложной частью является добавление информации о безопасности в запрос на основе учетных данных клиента.

То, что я хочу сделать, - это получить доступ к объекту ClientCredentials (который присоединен к используемому ClientProxy) из моей реализации канала. Обычно я получаю доступ к этому через свойство Behaviors в экземпляре ServiceEndpoint для конечной точки, которую я пытаюсь достичь:

var credentials = channel.Endpoint.Behaviors.Find<ClientCredentials>();

Однако я не могу найти способ доступа к конечной точке службы, с которой связан канал, из самого канала - почти нулевые метаданные доступны из класса ChannelBase.

Есть ли способ получить конечную точку, с которой связан мой канал? Есть ли альтернативный способ доступа к учетным данным клиента на стороне клиента?

Ответы [ 2 ]

2 голосов
/ 03 сентября 2011

Стандартные каналы безопасности не используют ClientCredentials внутри.Вместо этого они говорят с SecurityTokenManager, который построен из ClientCredentials.Я рекомендую использовать какой-нибудь дизассемблер для просмотра всей реализации.

Обычно ваш BindingElement должен построить и ChannelLister, и ChannelFactory и передать им всю необходимую информацию.

0 голосов
/ 03 сентября 2011

Реализуйте свой собственный клиентский сервис.

Например;

    using System;
    using System.ServiceModel;
    using System.ServiceModel.Channels;


public class UserClient : ClientBase<IAsyncESPUserService> , IESPUserService
{
        /// <summary>
        /// Constructor - No Parameters, this will use a default target endpoint.
        /// </summary>
        public UserClient() : base() { }

        /// <summary>
        /// Constructor - Binding and Address Parameters
        /// </summary>
        /// <param name="binding">How we are communicating.</param>
        /// <param name="address">The address we are communicating to.</param>
        public UserClient(Binding binding, EndpointAddress address) : base(binding, address) { }

        /// <summary>
        /// Constructor - Configuration Name Parameter
        /// </summary>
        /// <param name="endpointConfigurationName">The name of the configuration in ServiceReferences.ClientConfig. </param>
        public UserClient(string endpointConfigurationName) : base(endpointConfigurationName) { }

           //Implement your async service calls here       
}

Теперь назовите это ...

//Create using the default endpoint
UserClient client = new UserClient();


//Set user name and password with call
System.ServiceModel.Description.ClientCredentials loginCredentials = new System.ServiceModel.Description.ClientCredentials();
loginCredentials.UserName.UserName = "test";
loginCredentials.UserName.Password = "test";

//Attach Credentials, Can't do this in config file
var defaultCredentials = client.ChannelFactory.Endpoint.Behaviors.Find<System.ServiceModel.Description.ClientCredentials>();
client.ChannelFactory.Endpoint.Behaviors.Remove(defaultCredentials);
client.ChannelFactory.Endpoint.Behaviors.Add(loginCredentials);

//Now make a call to a service method...
...