Отдел продаж
8 800 250 60 77

Реализация авторизации в заглушке SOAP сервиса на C#. СПИК

Например, класс сгенерированной заглушки сервиса UnitsService называется SpicSoapUnitsServiceClient. Чтобы реализовать авторизацию в SpicSoapUnitsServiceClient, необходимо добавить два класса в проект, в котором создавалась заглушка к сервису: препроцессор запросов к SOAP сервису и Behavior (поведение). Код этих классов будет приведен ниже.

Функция препроцессора заключается во вложении токена авторизации в каждый http запрос, который идет к СПИК. В данном классе используется статический класс TokenRepository. Его публичное поле Token содержит токен авторизации. Он помещается туда после того, как авторизация выполнена (см. Авторизация в СПИК):

internal class AuthorizationPreprocessor : IClientMessageInspector
{
    public void AfterReceiveReply(ref Message reply, object correlationState)
    {
        Console.WriteLine("Data received");
    }

    public object BeforeSendRequest(ref Message request, System.ServiceModel.IClientChannel channel)
    {
        if (!request.Properties.ContainsKey("httpRequest"))
        {
            request.Properties.Add("httpRequest",new HttpRequestMessageProperty());
            LogManager.ExceptionLog.Error(request.ToString());
        }
        var httpHeader = request.Properties["httpRequest"] as HttpRequestMessageProperty;
        var user = Thread.CurrentPrincipal as ScoutPrincipal;
        if (user == null || user.ScoutIdentity == null || user.ScoutIdentity.ScoutSession == null) return null;
        if (httpHeader != null)
        {
            httpHeader.Headers.Add("ScoutAuthorization", user.ScoutIdentity.ScoutSession.SpicToken);
        }
        return null;
    }
}

class AuthorizationBeh * avior:IEndpointBehavior
{
    private readonly AuthorizationPreprocessor _authorizationPreprocessor;

    public AuthorizationBehavior()
    {
        _authorizationPreprocessor=new AuthorizationPreprocessor();
    }

    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
    {
    }

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
        clientRuntime.MessageInspectors.Add(_authorizationPreprocessor);
    }

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
    {
    }

    public void Validate(ServiceEndpoint endpoint)
    {
    }
}

Чтобы добавить это поведение к заглушке SpicSoapUnitsServiceClient, необходимо выполнить следующий код:

//заглушка сервиса
_unitsClient = new SpicSoapUnitsServiceClient();

//добавляем поведение
_unitsClient.Endpoint.Behaviors.Add(new AuthorizationBehavior());

После этого все вызовы методов в unitsClient будут выполнены в авторизованном контексте.

<<Назад                                                       К оглавлению                                                                     Далее>>

Уважаемые партнеры ГК СКАУТ.
Для доступа к Базе Знаний пожалуйста авторизируйтесь на ресурсе СКАУТ-Университет.
В качестве логина используйте свой электронный ящик, а в качестве пароля используйте пароль для доступа к ресурсам СКАУТ-Сайт и СКАУТ-Форум. Если вы не знаете или забыли свой пароль, то вы можете восстановить пароль здесь.
Также в Базе Знаний есть специальная статья, описывающая операцию по восстановлению пароля.