Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Thread.CurrentPrincipal.Identity и TcpChannel


Автор: Moid 22.4.2013, 14:45
Есть серверный сервис и клинт. Проверка пользователей делается через создание TCPChannel.

Создаю соединение при первом логоне указав domain, username и password:

Код
        dict["name"] = "TpcBinary";
        dict["port"] = 0;
        dict["timeout"] = RemotingChannelTimeout;
        dict["secure"] = true;
        dict["tokenImpersonationLevel"] = TokenImpersonationLevel.Identification;
        dict["domain"] = domain;
        dict["username"] = username;
        dict["password"] = password;

        var clientSinkProvider = new BinaryClientFormatterSinkProvider();
        var serverSinkProvider = new BinaryServerFormatterSinkProvider
                            {
                                TypeFilterLevel = TypeFilterLevel.Full
                            };

        tcpChannel = new TcpChannel(dict, clientSinkProvider, serverSinkProvider);
        ChannelServices.RegisterChannel(tcpChannel, false);


Thread.CurrentPrincipal.Identity - возвращает верного пользователя(того, что указали при создании коннекта).

Затем пытаюсь прилогиниться под другим пользователем(текущий пользователь)

Код
public void CloseConnection()
        {
            if (tcpChannel != null)
            {
                tcpChannel.StopListening(null);
                ChannelServices.UnregisterChannel(tcpChannel);
                tcpChannel = null;
            }
        }
//And try new connect:

    C#
    dict["name"] = "TpcBinary";
    dict["port"] = 0;
    dict["timeout"] = RemotingChannelTimeout;
    dict["secure"] = true;
    dict["tokenImpersonationLevel"] = TokenImpersonationLevel.Identification;
    dict["useDefaultCredentials"] = true;
    dict["domain"] = null;
    dict["username"] = null;
    dict["password"] = null;

var clientSinkProvider = new BinaryClientFormatterSinkProvider();
    var serverSinkProvider = new BinaryServerFormatterSinkProvider
                        {
                            TypeFilterLevel = TypeFilterLevel.Full
                        };

    tcpChannel = new TcpChannel(dict, clientSinkProvider, serverSinkProvider);
    ChannelServices.RegisterChannel(tcpChannel, false);


Thread.CurrentPrincipal.Identity - Возвращает пользователя, которого указывали при создании первого соединения, а не текущего пользователя системы!!!

Если пытаться реконнектиться по полным кредам(domain, username и password) то Thread.CurrentPrincipal.Identity возвращает правильного пользователя.

В чем может быть причина?

Автор: Moid 23.4.2013, 11:59
http://www.developmentnow.com/g/24_2006_4_0_0_730054/Credentials-cannot-be-changed-on-TcpChannels.htm

http://msdn.microsoft.com/en-us/library/ff648645.aspx

Автор: Moid 29.4.2013, 10:30
Зметил, через 15-20 мин после первой попытки коннект проходит. Пытался выставлять минимальный таймаут, поведение прежнее.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)