【问题标题】:CheckAccessCore not being called in custom ServiceAuthorizationManagerCheckAccessCore 未在自定义 ServiceAuthorizationManager 中调用
【发布时间】:2011-04-03 00:11:53
【问题描述】:

我正在开发将在 Azure 中托管的 WCF REST 服务,并希望检查用户 ID。为此,我创建了一个自定义 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>

但是,当我通过 IE 调用服务时,似乎没有调用 CheckAccessCore() 方法。所以问题是我如何确保它被调用,从而确保我的用户得到验证。

我在 CheckAccessCore 中设置了一个断点,但它似乎永远不会被击中。

为了让事情变得真正有趣 - 我需要从 Silverlight 中调用这个 Web 服务。

提前致谢

【问题讨论】:

    标签: wcf rest azure


    【解决方案1】:

    忽略配置中的“服务”部分。试试:

    <standardEndpoints>
      <webHttpEndpoint>
        <standardEndpoint crossDomainScriptAccessEnabled="True" automaticFormatSelectionEnabled="true" helpEnabled="True"/>
      </webHttpEndpoint>
    </standardEndpoints>
    

    【讨论】:

      【解决方案2】:

      按照上面粘贴的配置,我看到服务行为“安全”错过了应用于服务。请检查一下,如果不是错字...

      【讨论】:

      • 不——不是错字。我想不出一种将它添加到服务标签的方法——我应该在里面放什么。
      • 您可以在元素中添加behaviorConfiguration="Secure",即添加behaviourConfiguration后,service元素应该如下所示,跨度>
      猜你喜欢
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      • 2015-09-13
      相关资源
      最近更新 更多