WCF + Лазурь = Кошмар! - PullRequest
       7

WCF + Лазурь = Кошмар!

4 голосов
/ 02 ноября 2009

Я провел предыдущую неделю, пытаясь настроить безопасную форму WCF для работы в Azure, но все безрезультатно! Мой вариант использования довольно прост. Я хочу вызвать конечную точку WCF в облаке и передать сообщения в очередь для рабочей роли. Кроме того, я хочу ограничить доступ предварительно авторизованным пользователям, аутентифицированным через имя пользователя и пароль.

Я пытался заставить это работать с безопасностью Transport, TransportWithMessageCredential и Message, но, похоже, ничего не работает. Действительно, я рассмотрел каждый пример и фрагмент, который смог найти, совсем недавно - пример «Служба, использующая двоичное HTTP-связывание с защитой транспорта и учетными данными сообщения и клиентом Silverlight» на странице http://code.msdn.microsoft.com/wcfazure. Я почти уверен, что меня сбивают мелкие ошибки и бета-изменения, но в итоге я полностью застрял.

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

Ответы [ 4 ]

4 голосов
/ 02 ноября 2009
2 голосов
/ 01 мая 2010

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

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

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

Если вы не используете один из них, то, как я понимаю, WCF потерпит неудачу, но на самом деле не скажу, почему. Таким образом, вы можете в конечном итоге гоняться за призраком ошибки кода, которого на самом деле нет.

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

Я знаю, как это сделать только с анонимными пользователями, но, возможно, мои настройки помогут вам разобраться в этом. Приведенный ниже код, который я знаю, работает с анонимными пользователями, возможно, вы можете использовать его для аутентификации. Кроме того, единственный способ защитить конечную точку Web - это предоставить ее через HTTPS с использованием безопасности транспорта (источник: http://msdn.microsoft.com/en-us/library/aa702697.aspx).

web.config

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
  </system.serviceModel>

Inferface

IExample.cs:

using System.ServiceModel;
using System.ServiceModel.Web;

namespace WebPages.Interfaces
{
    [ServiceContract]
    public interface IExample
    {
        [OperationContract]
        [WebInvoke(Method = "GET",
            ResponseFormat = WebMessageFormat.Json)]
        string GetSomething(string id);
    }
}

ExampleService.svc.cs разметка

<%@ ServiceHost Language="C#" Debug="true" Service="WebPages.Interfaces.ExampleService" CodeBehind="ExampleService.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

ExampleService.svc.cs codebehind

namespace WebPages.Interfaces
{
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class ExampleService : IExample
    {
        string JsonSerializeSomething(Something something)
        {
            var serializer = new DataContractJsonSerializer(something.GetType());
            var memoryStream = new MemoryStream();

            serializer.WriteObject(memoryStream, something);

            return Encoding.Default.GetString(memoryStream.ToArray());
        }

        public string GetSomething(string id)
        {
            var something = DoSomeBusinessLogic(id);

            return JsonSerializeSomething(something);
        }
    }
}

jQuery звонок от клиента

function _callServiceInterface(id, delegate) {
    var restApiCall = "Interfaces/ExampleService.svc/GetSomething?id="
            + escape(id);

    $.getJSON(restApiCall, delegate);
}

function _getSomethingFromService() {
    _callServiceInterface('123',
        function (result) {
            var parsedResult = $.parseJSON(result);
            $('#info').html(result.SomethingReturnedFromServiceCall);
        }
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...