2017-08-19 17 views
11

をwebhttpbinding WCFに発射したことがない:CustomAuthorizationPolicy.Evaluate()メソッドは、あなたが見ることができるように私は、WCFサービスを作成

[OperationContract] 
[PrincipalPermission(SecurityAction.Demand, Role = "Admin")] 
[WebInvoke(Method = "GET", UriTemplate = "/Data/{data}")] 

string GetData(string data); 

だから私はあなたが見ることができるようにカスタム認可作成:

public class AuthorizationPolicy : IAuthorizationPolicy 
{ 
    string id = Guid.NewGuid().ToString(); 

    public string Id 
    { 
     get { return this.id; } 
    } 

    public System.IdentityModel.Claims.ClaimSet Issuer 
    { 
     get { return System.IdentityModel.Claims.ClaimSet.System; } 
    } 

    // this method gets called after the authentication stage 
    public bool Evaluate(EvaluationContext evaluationContext, ref object state) 
    { 
     // get the authenticated client identity 
     IIdentity client = HttpContext.Current.User.Identity; 

     // set the custom principal 
     evaluationContext.Properties["Principal"] = new CustomPrincipal(client); 

     return true; 
    } 
} 

public class CustomPrincipal : IPrincipal 
{ 
    private IIdentity _identity; 
    public IIdentity Identity 
    { 
     get 
     { 
      return _identity; 
     } 
    } 

    public CustomPrincipal(IIdentity identity) 
    { 
     _identity = identity; 
    } 

    public bool IsInRole(string role) 
    { 
     //my code 
     return true; 

     // return Roles.IsUserInRole(role); 
    } 
} 

そして、認証:

public class RestAuthorizationManager: ServiceAuthorizationManager 
    { 
     protected override bool CheckAccessCore(OperationContext operationContext) 
     { 
      //Extract the Authorization header, and parse out the credentials converting the Base64 string: 
      var authHeader = WebOperationContext.Current.IncomingRequest.Headers["Authorization"]; 
      if ((authHeader != null) && (authHeader != string.Empty)) 
      { 
       var svcCredentials = System.Text.ASCIIEncoding.ASCII 
        .GetString(Convert.FromBase64String(authHeader.Substring(6))) 
        .Split(':'); 
       var user = new 
       { 
        Name = svcCredentials[0], 
        Password = svcCredentials[1] 
       }; 
       if ((user.Name == "1" && user.Password == "1")) 
       { 
        //here i get the role of my user from the database 
        // return Admin role 
        //User is authrized and originating call will proceed 
        return true; 
       } 
       else 
       { 
        //not authorized 
        return false; 
       } 
      } 
      else 
      { 
       //No authorization header was provided, so challenge the client to provide before proceeding: 
       WebOperationContext.Current.OutgoingResponse.Headers.Add("WWW-Authenticate: Basic realm=\"MyWCFService\""); 
       //Throw an exception with the associated HTTP status code equivalent to HTTP status 401 
       throw new WebFaultException(HttpStatusCode.Unauthorized); 
      } 
     } 
    } 

私は自分のIISでホスティングしてhttpsホスティングを行い、サービスをアップロードすると、私の認証私のWeb設定で自分の認証を定義することはできません。

<?xml version="1.0"?> 
<configuration> 

<appSettings> 
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 
</appSettings> 
<system.web> 
<compilation debug="true" targetFramework="4.5.2" /> 
<httpRuntime targetFramework="4.5.2"/> 
</system.web> 
<system.serviceModel> 
<client /> 

<bindings> 
    <webHttpBinding> 
    <binding> 
     <security mode="Transport" /> 
    </binding> 
    </webHttpBinding> 
</bindings> 

<behaviors> 
    <serviceBehaviors> 
    <behavior name="ServiceBehavior"> 

     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
     <serviceAuthorization 
     serviceAuthorizationManagerType 
    ="wcfrestauth.RestAuthorizationManager, wcfrestauth"/> 
    </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
    <behavior name="webHttpServiceBehavior"> 
     <!-- Important this is the behavior that makes a normal WCF service to REST based service--> 
     <webHttp/> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
<services> 
    <service name="wcfrestauth.Service1" behaviorConfiguration="ServiceBehavior"> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost/WCFRestAuthentication/api/" /> 
     </baseAddresses> 
    </host> 
    <endpoint binding="webHttpBinding" contract="wcfrestauth.IService1" behaviorConfiguration="webHttpServiceBehavior" /> 
    </service> 
</services> 

<protocolMapping> 
    <add binding="webHttpBinding" scheme="https"/> 

</protocolMapping> 

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 
<system.webServer> 
<modules runAllManagedModulesForAllRequests="true"/> 
<directoryBrowse enabled="true"/> 
</system.webServer> 

</configuration> 

私が.theのサービスは、AUTHORIZEのfunction.iがWebConfigの内側に私のカスタムのauthorizeクラスを定義する必要がありますチェックしませんが、私は方法がわからないクライアントで私のサービスを呼び出すとき、私は意味ですか?あなたのweb configファイルにserviceCredentialsを設定する必要があるかもしれません

public bool IsInRole(string role) 
{ 
    //my code 
    return true; 

    // return Roles.IsUserInRole(role); 
} 
+0

私は本当にあなたの助けが必要です –

答えて

0

あなたは<serviceAuthorization>タグ内のカスタムAuthorizationPolicyを指定することができ、例:

<serviceAuthorization serviceAuthorizationManagerType= 
     "wcfrestauth.RestAuthorizationManager, wcfrestauth"> 
    <authorizationPolicies>   
    <add policyType="wcfrestauth.AuthorizationPolicy, wcfrestauth" 
    </authorizationPolicies> 
</serviceAuthorization> 

WCFドキュメントには、WCFサービス用にCustom Authorization Policyを実装するための良い例があります。

ただし、抽象AuthorizationManager基本クラスのCheckAccessメソッドをオーバーライドする場合は注意してください。基本クラスのメソッドは、GetAuthorizationPoliciesメソッドを内部的に呼び出して、存在するすべてのIAuthorizationPolicyオブジェクトのコレクションを取得します(this blog articleも参照)。

CheckAccesをオーバーライドし、親クラスのメソッドを呼び出さない場合、IAuthorizationPolicyオブジェクトのEvaluateメソッドは呼び出されません。

関連する問題