2016-07-10 4 views
-1

Ich habe versucht, dies für ein paar Tage herauszufinden. Ich weiß, dass ich in der Nähe bin, kann aber nicht genau herausfinden, was ich vermisse.Probleme mit der Standardauthentifizierung und WCF-REST-Dienstkonfiguration

  • Der Service ist in einer Website auf IIS gehostet
  • Standardauthentifizierung für die Website aktiviert ist, und alle anderen, einschließlich anonyme Authentifizierung ist deaktiviert.
  • Ich habe ein selbstsigniertes Zertifikat erstellt und eine HTTPS-Bindung eingerichtet
  • Ich habe die Validate-Methode des UsernamePasswordValidator überschrieben, aber wenn ich einen Haltepunkt anfügen, wird es nicht erreicht. Also mein Problem hat wahrscheinlich etwas damit zu tun.
  • Wenn ich versuche, auf meine Service-Methode unter https://localhost/Services/JobSiteService.svc/rest/get zuzugreifen, werde ich ständig aufgefordert, den Benutzernamen und das Passwort einzugeben, da ich einen nicht autorisierten 401-Fehler erhalte.

Kann jemand sehen, was ich falsch mache?

entsprechenden Code unten:

Web.Config

<system.serviceModel> 
<bindings> 
    <webHttpBinding> 
    <binding name="webHttpTransportSecurity"> 
     <security mode="Transport"> 
     <transport clientCredentialType="Basic" /> 
     </security> 
    </binding> 
    </webHttpBinding> 
</bindings> 

<services> 
    <service name="Validity.WebService.JobSiteService" behaviorConfiguration="SecureRestBehavior"> 
    <endpoint address="rest" binding="webHttpBinding" behaviorConfiguration="RESTBehavior" bindingConfiguration="webHttpTransportSecurity" contract="Validity.WebService.Contracts.IJobSiteService" /> 
    <endpoint address="meta" binding="mexHttpsBinding" contract="IMetadataExchange" /> 
    </service> 
</services> 

<behaviors> 
    <serviceBehaviors> 
    <behavior name="SecureRestBehavior"> 
     <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="false"/> 

     <serviceCredentials> 
     <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Validity.WebService.IdentityValidator, Validity.WebService" /> 
     </serviceCredentials> 
    </behavior> 
    </serviceBehaviors> 

    <endpointBehaviors> 
    <behavior name="RESTBehavior" > 
     <webHttp/> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

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

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 

Service-Vertrag:

[ServiceContract] 
public interface IJobSiteService 
{ 
    [OperationContract] 
    [WebInvoke(Method="GET", ResponseFormat=WebMessageFormat.Json)] 
    List<JobSite> Get(); 
} 

Individuelle Validator (es ist im Namensraum "Validity.WebService", aber die Code Formatierung brach, als ich es einschloss.):

 public override void Validate(string userName, string password) 
    { 
     using (var context = new ValidityContext()) 
     { 

      using (var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context))) 
      { 
       var user = userManager.Find(userName, password); 
       if (user == null) 
       { 
        var msg = String.Format("Unknown Username {0} or incorrect password {1}", userName, password); 
        throw new FaultException(msg);//the client actually will receive MessageSecurityException. But if I throw MessageSecurityException, the runtime will give FaultException to client without clear message. 
       } 
       else 
       { 

        SessionOperationContext.Current.Items["CurrentUser"] = user; 
       } 
      } 
     } 
    } 

Jede Hilfe mit diesem würde sehr geschätzt werden.

+0

Sie haben nur die Informationen zur Serverseite angezeigt. Es ist der Client, der den Autorisierungsheader für IIS bereitstellen muss, damit der Fokus zuerst darauf liegt. – Crowcoder

+0

Dank Crowcoder, es sah aus wie ein Problem war mit IIS Validierung meines Auth-Headers gegen Windows-Anmeldeinformationen, anstatt meine benutzerdefinierte Validierungsmethode zu verwenden. – ErnieStings

Antwort

0

Endlich herausgefunden.

Die Lösung bestand darin, die Basisauthentifizierung auf dem IIS-Server zu deaktivieren und die CheckAccessCore-Methode des ServiceAuthorizationManager zu überschreiben, um den Benutzer zu validieren.

+0

ja es funktioniert, aber ich habe eine andere Frage, implementieren Sie eine Autorisierung in wcf webhttpbinding? Https: //stackoverflow.com/questions/45770217/my-customauthorizationpolicy-evaluate-method-new-fires –

Verwandte Themen