RESTful служба безопасности WCF - PullRequest
2 голосов
/ 19 января 2012

Как мы могли бы аутентифицировать / авторизовать службу WCF RESTful (которая использует webHttpBinding (а не wsHttpBinding, как в случае с SOAP))? То есть мы хотим использовать членство / роли, чтобы разрешить (или запретить) пользователю использовать каждый веб-метод в соответствии с его ролью.

Заранее спасибо. Илан.

1 Ответ

4 голосов
/ 19 января 2012

Вы можете использовать сертификаты для защиты сервиса или отправить имя пользователя и пароль в шапке.Затем вы можете добавить поведение, внедрив в службу IAuthorizationPolicy, чтобы вам не приходилось реализовывать проверку безопасности в каждом предоставляемом вами методе веб-службы.

public class CertificateAuthorizationPolicy : IAuthorizationPolicy
{

    public bool Evaluate(EvaluationContext evaluationContext, ref object state)
    {
        IIdentity identity;
        object untypedIdentities;
        if (!evaluationContext.Properties.TryGetValue("Identities", out untypedIdentities))
        {
            identity = null;
            return false;                                                                                                             
        }

        var identities = (IEnumerable<IIdentity>)untypedIdentities;

        identity = identities.Where(item => item.AuthenticationType == "X509").FirstOrDefault();

        var claimSet = (X509CertificateClaimSet)evaluationContext.ClaimSets[0];
        var certificate = claimSet.X509Certificate;

    }

В файле web.config вы указываете службе использовать политику авторизации

    <behavior name="CertificateSecurityServiceBehavior">
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceAuthorization principalPermissionMode="Custom">
        <authorizationPolicies>
          <add policyType="CertificateAuthorizationPolicy, MyAssembly.Security" />
        </authorizationPolicies>
      </serviceAuthorization>
      <dataContractSerializer maxItemsInObjectGraph="2147483647" />
    </behavior>

Другой вариант - настроить SSL на сервере IIS, чтобы для него требовались SSL и сертификат клиента дляподключиться к любой странице.

...