2011-04-03 21 views
0

私はAzure内でホストされるWCF RESTサービスを開発中で、ユーザーIDを確認したいと考えています。この目的のために私はカスタムのServiceAuthorizationManagerを作成しました。カスタムServiceAuthorizationManagerでCheckAccessCoreが呼び出されていない

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にブレークポイントを設定しましたが、決してヒットしないようです。

ちょっと面白いことに、私はこのWebサービスをSilverlightから呼び出す必要があります。設定後、事前

答えて

0

おかげで、私はそのサービスの動作は、「セキュア」を参照し、上記の貼り付けサービスに適用するために逃しています。それがオススメではない場合、それをチェックしてください...

+0

いいえ - 誤字ではありません。私はそれをサービスタグに追加する方法を理解できませんでした。私はそこに何を入れるべきですか? –

+0

要素にbehaviorConfiguration = "Secure"を追加できます。つまり、behaviorConfigurationを追加した後、サービス要素は以下のようになります。 amit

0

設定のあなたの 'サービス'セクションを無視してください。試してください:

<standardEndpoints> 
    <webHttpEndpoint> 
    <standardEndpoint crossDomainScriptAccessEnabled="True" automaticFormatSelectionEnabled="true" helpEnabled="True"/> 
    </webHttpEndpoint> 
</standardEndpoints> 
関連する問題