2017-08-19 47 views
11

utworzyć usług wcf jak widać:CustomAuthorizationPolicy.Evaluate() nigdy pożary w WCF webhttpbinding

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

string GetData(string data); 

Więc utworzyć niestandardowy autoryzacji jak widać:

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); 
    } 
} 

I uwierzytelnianie:

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); 
      } 
     } 
    } 

Więc tworzę i https gospodarzem moim IIS i przesłać usługę, mój authenticati na zajęciach działa, ale moje upoważnienie nie .why? Definiuję moje uwierzytelnianie w mojej konfiguracji sieci, jak widać. Ale nie wiem, jak mogę zdefiniować mój autoryzacji w mojej konfiguracji sieci.

<?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> 

Znaczy gdy zgłoszę moją usługę klient .the usługa nie sprawdza function.i autoryzacji powinny definiować mój zwyczaj zezwolić klasę wewnątrz webconfig ale nie wiem jak?

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

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

Naprawdę potrzebuję twojej pomocy –

Odpowiedz

0

można określić niestandardową AuthorizationPolicy ciągu <serviceAuthorization> znaczników, np .:

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

W dokumentach WCF istnieje dobry przykład implementacji usługi Custom Authorization Policy dla usługi WCF.

Należy jednak zachować ostrożność przy nadpisywaniu metody CheckAccess abstrakcyjnej klasy bazowej AuthorizationManager. Metoda klasy bazowej wywołuje wewnętrznie metodę GetAuthorizationPolicies w celu pobrania kolekcji wszystkich obiektów IAuthorizationPolicy (patrz także: this blog article).

Jeśli zastąpisz CheckAcces i nie wywołasz metody klasy nadrzędnej, nie zostanie wywołana żadna metoda oceny obiektów IAuthorizationPolicy.

Powiązane problemy