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