Как настроить аутентификацию WorkflowService? - PullRequest
1 голос
/ 06 марта 2012

Мне просто нужно защитить свои сервисы WF. Не могу найти никаких ресурсов по этому вопросу. Как это сделать?

Уже пробовал:

class Program
{
    static void Main(string[] args)
    {
        using (WorkflowServiceHost host = new WorkflowServiceHost(new Workflow1(), new Uri("http://localhost/Test")))
        {
            host.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = System.ServiceModel.Security.UserNamePasswordValidationMode.Custom;
            host.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new Test();

            host.Open();
            Console.Write("ready");
            Console.ReadLine();
        }
    }
}
public class Test : UserNamePasswordValidator
{
    public Test()
    {
        Console.Write("hit");
    }

    public override void Validate(string userName, string password)
    {
        Console.Write("never hit");
    }
}

и конфиг

<bindings>
  <wsHttpBinding>
    <binding>
      <security mode="Message">
        <message clientCredentialType="UserName" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="false"/>
      <!--<serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="myAssembly.Test, myAssembly" />
      </serviceCredentials>-->
    </behavior>
  </serviceBehaviors>
  • Невозможно создать конечную точку с фиксированным именем, поскольку они создаются динамически

ОБНОВЛЕНИЕ - я попробовал приведенную ниже конфигурацию и сработал, но я хочу более детальный способ установить, какую привязку использует каждая служба

<protocolMapping>
  <add scheme="http" binding="wsHttpBinding"/>
</protocolMapping>

Ответы [ 3 ]

2 голосов
/ 08 марта 2012

У нас есть эпизод Workflow TV, который должен помочь. Workflow TV - Безопасность служб Workflow

1 голос
/ 06 марта 2012

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

Тем не менее, для рабочего процесса вам, как правило, требуется более точный контроль для всех, кроме первого запроса. Например, все сотрудники могут создавать отчеты о расходах, но только сотрудник, начавший отчет о конкретных расходах, может добавить к нему расходы и отправить его. Вы можете выполнять такие проверки безопасности, используя WF Security Pack .

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

Немного хакерский, но работает. Переопределенный WorkflowServiceHost для получения неизвестных имен контрактов и добавления конечных точек служб для каждого.

    const string DEFAULT_WORKFLOW_SERVICE_BINDING_NAME = "WorkflowDefaultBinding";

    static void Main(string[] args)
    {            
        MyWorkflowServiceHost host = new MyWorkflowServiceHost(new CountingWorkflow2(), new Uri(hostBaseAddress));
        foreach (var contractName in host.ImplementedContractsNames)
        {
            // now I'm able to choose which binding to use depending on a condition
            var binding = new WSHttpBinding(DEFAULT_WORKFLOW_SERVICE_BINDING_NAME);

            host.AddServiceEndpoint(contractName, binding, string.Empty);
        }
    }

и MyWorkflowServiceHost

    public class MyWorkflowServiceHost : WorkflowServiceHost
    {
        public MyWorkflowServiceHost(Activity activity, params Uri[] baseAddresses)
            : base(activity, baseAddresses)
        {

        }

        private IDictionary<string, System.ServiceModel.Description.ContractDescription> _implementedContracts;
        public IEnumerable<string> ImplementedContractsNames
        {
            get
            {
                foreach (var contract in _implementedContracts)
                    yield return contract.Key;
            }
        }

        protected override System.ServiceModel.Description.ServiceDescription CreateDescription(out System.Collections.Generic.IDictionary<string, System.ServiceModel.Description.ContractDescription> implementedContracts)
        {
            System.ServiceModel.Description.ServiceDescription description = base.CreateDescription(out implementedContracts);

            _implementedContracts = implementedContracts;

            return description;
        }
    }

Добавление неименованного WSHttpBinding и следующего раздела по модели сервиса также должно работать, но для конфигурации по умолчанию

<protocolMapping>
  <add scheme="http" binding="wsHttpBinding"/>
</protocolMapping>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...