проблемы аутентификации в доменной службе RIA (доступ к операции запрещен) - PullRequest
1 голос
/ 09 апреля 2011

DomainService1 - это служба домена RIA, представленная как служба SOAP.Эта служба была защищена с помощью атрибутов [RequAuthentication] и [requireRole ("xyz")].

В файле web.config был включен roleManager и для режима аутентификации задано значение Forms.Тестовый клиент использует следующий код для проверки подлинности и запуска операции удаленного сервиса:

        var auth = new myAuth.AuthenticationDomainServiceSoapClient();
        var svc = new mySvc.DomainService1SoapClient();

        try
        {
            string myCookie;

            using (new OperationContextScope(auth.InnerChannel))
            {
                var user = auth.Login(svcUser.Text, svcPass.Text, false, string.Empty);

                var res = (HttpResponseMessageProperty)OperationContext.Current.IncomingMessageProperties[HttpResponseMessageProperty.Name];
                myCookie = res.Headers[HttpResponseHeader.SetCookie];
            }

            using (new OperationContextScope(svc.InnerChannel))
            {
                var octx = OperationContext.Current;
                HttpRequestMessageProperty request = new HttpRequestMessageProperty();
                request.Headers["Cookie"] = myCookie;
                 OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = request;

                var results = svc.GetItems();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

Я вижу вызов auth.Login фактически возвращает нужного пользователя, и в этом объекте я вижу рольустановить правильно.Однако вызов GetItems завершается неудачно, и возникает исключение, в котором говорится «Доступ к операции запрещен».

Я что-то пропускаю?Вы видите что-нибудь очевидное, что я пропускаю?

Заранее спасибо,

Приветствия, Джанлука.

[EDIT] Я хотел быдобавить, что в EventLog я получаю это: Проверка подлинности с помощью форм не удалось для запроса.Причина: предоставленный билет недействителен.

Есть идеи о причине?

Приветствия.

Ответы [ 2 ]

0 голосов
/ 06 марта 2012

Ответ , отправленный на этот Аутентификация RIA из проекта веб-служб. Вопрос, похоже, содержит отсутствующую ссылку.

Дополнительный шаг, отсутствующий в вашем коде (и моем), это метод FormatCookie (), используемый для чтения свойства HttpResponseHeader.SetCookie.

/// <summary>
/// Formats a request cookie string from the cookies received from the authentication service
/// </summary>
/// <param name="input">The cookie string received from the authentications service</param>
/// <returns>A formatted cookie string to send to data requests</returns>
private static string FormatCookie(string input)
{
    string[] cookies = input.Split(new char[] { ',', ';' });
    StringBuilder buffer = new StringBuilder(input.Length * 10);
    foreach (string entry in cookies)
    {
        if (entry.IndexOf("=") > 0 && !entry.Trim().StartsWith("path") && !entry.Trim().StartsWith("expires"))
        {
            buffer.Append(entry).Append("; ");
        }
    }
    if (buffer.Length > 0)
    {
        buffer.Remove(buffer.Length - 2, 2);
    }
    return buffer.ToString();
}

Лично я использовал метод CookieManager, описанный здесь http://blogs.msdn.com/b/davrous/archive/2010/12/03/how-to-open-a-wcf-ria-services-application-to-other-type-of-clients-the-soap-endpoint-3-5.aspx, а затем добавил к нему метод FormatCookie (), чтобы он заработал.

0 голосов
/ 28 апреля 2011

У меня была похожая проблема (исключение), когда данные, которые я хранил в куки, слишком длинные. Старайтесь хранить только важные данные в файле cookie сеанса, так как он ограничен 4k. Несмотря на то, что вход выполнен успешно, при последующих вызовах он выдает ошибку «Отказано в доступе», поскольку файл cookie слишком большой.

...