CheckAccessCore не вызывается в пользовательском ServiceAuthorizationManager - PullRequest
0 голосов
/ 03 апреля 2011

Я работаю над службой REST WCF, которая будет размещена в Azure, и хочу проверить идентификатор пользователя.Для этого я создал пользовательский ServiceAuthorizationManager.

namespace SecureService
{
    public class AccessControlServiceAuthorizationManager : ServiceAuthorizationManager 
    {
        String serviceNamespace      = String.Empty;
        String acsHostname           = String.Empty;
        String trustedTokenPolicyKey = String.Empty;
        String trustedAudience       = String.Empty;

        public AccessControlServiceAuthorizationManager()
        {
            try
            {
                serviceNamespace      = RoleEnvironment.GetConfigurationSettingValue("serviceNamespace");
                acsHostname           = RoleEnvironment.GetConfigurationSettingValue("acsHostname");
                trustedTokenPolicyKey = RoleEnvironment.GetConfigurationSettingValue("trustedTokenPolicyKey");
                trustedAudience       = RoleEnvironment.GetConfigurationSettingValue("trustedAudience");
            }
            catch
            {
                GenerateErrorResponse();
            }
            finally
            {

            }
        }                                   // end AccessControlServiceAuthorizationManager() Constructor

        protected override bool CheckAccessCore(OperationContext operationContext)
        {
            String headerValue = WebOperationContext.Current.IncomingRequest.Headers[HttpRequestHeader.Authorization];
            String token = String.Empty;
            string[] nameValuePair = null;
            TokenValidator validator = null;


            if (String.IsNullOrEmpty(headerValue))
            {
                GenerateErrorResponse();
                return false;
            }

            if (!headerValue.StartsWith("WRAP "))
            {
                GenerateErrorResponse();
                return false;
            }

            nameValuePair = headerValue.Substring("WRAP ".Length).Split(new char[] { '=' }, 2);

            if (nameValuePair.Length != 2 || 
                nameValuePair[0] != "access_token" || 
                !nameValuePair[1].StartsWith("\"") || 
                !nameValuePair[1].EndsWith("\""))
            {
                GenerateErrorResponse();
                return false;
            }

            token     = nameValuePair[1].Substring(1, nameValuePair[1].Length - 2);
            validator = new TokenValidator(acsHostname, serviceNamespace, trustedAudience, trustedTokenPolicyKey);

            if (!validator.Validate(token))
            {
                GenerateErrorResponse();
                return false;
            }

            return true;
        }

        public void GenerateErrorResponse()
        {

        }
    }
}

Мой Web.config выглядит следующим образом:

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <behaviors>
        <serviceBehaviors>
            <behavior name="Secure">
                <serviceAuthorization serviceAuthorizationManagerType="SecureService.AccessControlServiceAuthorizationManager" />
            </behavior>
        </serviceBehaviors>
        <endpointBehaviors>
            <behavior name="webBehavior">                       
                <webHttp />
            </behavior>
        </endpointBehaviors>
    </behaviors>
    <services>
        <service name="SecureService.Demo">
            <endpoint address="" behaviorConfiguration="webBehavior" binding="webHttpBinding" bindingConfiguration="" contract="SecureService.IDemo" />
            <endpoint address="rest" behaviorConfiguration="webBehavior" binding="webHttpBinding" bindingConfiguration="" contract="SecureService.IDemo" />
        </service>
    </services>
</system.serviceModel>
<system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
        <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </modules>
</system.webServer>

ОднакоМетод CheckAccessCore (), кажется, не вызывается, когда я вызываю службу через IE.Поэтому вопрос заключается в том, как я могу гарантировать, что он вызывается, и, следовательно, гарантировать, что мои пользователи проверены.

Я поставил точку останова в CheckAccessCore, и, кажется, она никогда не получит удар.просто чтобы сделать вещи действительно интересными - мне нужно будет позвонить на этот веб-сервис из Silverlight.

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

Ответы [ 2 ]

0 голосов
/ 06 ноября 2011

Игнорировать ваш раздел «услуги» в конфигурации.Попробуйте:

<standardEndpoints>
  <webHttpEndpoint>
    <standardEndpoint crossDomainScriptAccessEnabled="True" automaticFormatSelectionEnabled="true" helpEnabled="True"/>
  </webHttpEndpoint>
</standardEndpoints>
0 голосов
/ 03 апреля 2011

Следуя конфигурации, вставленной выше, я вижу, что поведение службы «Безопасный» пропущено для применения в службе.Пожалуйста, проверьте, если это не опечатка ...

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