Есть ли способ узнать, какой пользователь вызывает службу WCF Ria на стороне сервера, используя silverlight на стороне клиента? - PullRequest
0 голосов
/ 29 декабря 2011

Есть ли способ узнать, какой пользователь вызывает службу WCF Ria на стороне сервера? Клиентская сторона siverlight, пользователь должен пройти аутентификацию в первую очередь для использования системы.

Мне нужно знать, какой пользователь на самом деле вызывает службу в моей текущей задаче, спасибо, я много искал, но, похоже, ничего хорошего не нашел.

Ответы [ 2 ]

0 голосов
/ 29 декабря 2011

Я также очень много "гуглял" и получил много головной боли, прежде чем нашел решение. Я не использую RIA-Services - но это должно быть (надеюсь) то же самое ...:

SL-клиент отправляет серверу «запрос на вход в систему».

На стороне сервера (WCF) я делаю следующее (LoginData = Return-Info для SL-клиента):

public LoginData LoginRequest() {
    (...)
    OperationContext context = OperationContext.Current;
    System.ServiceModel.Channels.MessageProperties prp = context.IncomingMessageProperties;
    System.ServiceModel.Channels.RemoteEndpointMessageProperty endPrp = prp[System.ServiceModel.Channels.RemoteEndpointMessageProperty.Name] as System.ServiceModel.Channels.RemoteEndpointMessageProperty;
        (...)
        try {
            clientIP = endPrp.Address;
            System.Net.IPAddress ipAddress = System.Net.IPAddress.Parse(clientIP);
            System.Net.IPHostEntry ipHostEntry = System.Net.Dns.GetHostEntry(ipAddress);
        (...)

Если вы хотите проверить пользователей WindowsPrincipal, вы можете сделать следующее (securityGroup = настройка на стороне сервера, в которую пользователи могут войти):

    (...)
    switch (securityGroup) {
            case SecurityGroup.AllClientsCanAccess: {
                clientCanLogin = true;
            } break;
            case SecurityGroup.UseWindowsCredentials: {
                if (OperationContext.Current.ServiceSecurityContext != null && OperationContext.Current.ServiceSecurityContext.WindowsIdentity != null) {
                        if (OperationContext.Current.ServiceSecurityContext.WindowsIdentity.IsAuthenticated) {

                            if (subSecurityInfo1 == true) { // only clients in specific roles can log in
                                bool userRoleFound = false;

                                WindowsPrincipal userPrincipal = new WindowsPrincipal(OperationContext.Current.ServiceSecurityContext.WindowsIdentity);
                                if (userPrincipal == null)
                                    break;

                                foreach (string userRoleToPass in subSecurityList) {    // subSecurityList = settings, which roles can pass

                                    loginError.ErrorInfo += string.Format("{0}\n", userRoleToPass);

                                    if (userPrincipal.IsInRole(userRoleToPass)) {
                                        clientCanLogin = userRoleFound = true;
                                        break;
                                    }
                                }

                                if (userRoleFound) {
                                    loginError.ErrorInfo = string.Empty;
                                    break;
                                }
                                else {
                                    loginError.ErrorNo = LoginErrorCodeNoEnum.UserIsNotInRole;
                                }
                            }
                            (...)

Надеюсь, это поможет ...

0 голосов
/ 29 декабря 2011

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

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

Единственное руководство для создания токенов - это то, что они уникальны, непредсказуемы и истекают. Я всегда шифровал свои токены, чтобы они выглядели как бред, но шаг это необязательно.

...