2016-03-29 3 views
1

Ich habe ein wirklich merkwürdiges Verhalten, das ich versuche herauszufinden.PrincipalContext ValidateCredentials schlägt für einige Benutzer fehl, wenn es in einer Web-API verwendet wird

Ich habe eine ASP.NET 4.5-Web-API, die unter IIS ausgeführt wird, die verwendet wird, um Benutzeranmeldeinformationen gemäß dem folgenden Code für Active Directory zu überprüfen.

Es funktioniert für einige Benutzer in der AD aber wird immer falsch für andere Benutzer in der AD zurückgeben. Von der Protokollierung mit meinem benutzerdefinierten messageHandler weiß ich, dass es zum messageHandler.WriteSuccess Teil kommt. Ich weiß, dass es keine Ausnahme gibt.

Ich habe eine Windows Forms-Desktop-App geschrieben, die den gleichen Code verwendet, um auf dem Webserver zu helfen, das Problem zu beheben, aber es überprüft alle Benutzer korrekt.

Dies führte zu der Annahme, dass die ASP.NET-Web-API möglicherweise als Netzwerkdienste ausgeführt wird. Ich habe den App-Pool so geändert, dass ich die gleiche Identität verwende, mit der ich mich beim Webserver angemeldet habe, aber das machte keinen Unterschied.

Warum würde der exakt gleiche Code Benutzer in einer Windows Forms App korrekt validieren, aber nur einige Benutzer in einer ASP.net Web API korrekt validieren.

Als Workaround habe ich den Netzwerkadministrator erstellen brandneue AD-Benutzer für die Benutzer, die sich nicht anmelden können. Das funktioniert. Es muss ein Unterschied zwischen den AD-Benutzern, die fehlschlagen, und den AD-Benutzern, die erfolgreich sind, bestehen.

Es ist auch sehr seltsam, dass derselbe Code sich anders verhält, wenn er als Desktop-App ausgeführt wird, verglichen mit dem Ausführen von IIS.

Irgendwelche Ideen oder wie weiter zu beheben? Der Server ist Windows Server 2008 R2.

PrincipalContext pc = null; 
try 
{ 
    pc = new PrincipalContext(ContextType.Domain, domain); 

    var success = pc.ValidateCredentials(username, password); 
    if (loggingEnabled) 
    { 

     messageHandler.WriteSuccess(
      username, 
      HistoryLogEntry.OperationType.ActiveDirectory, 
      HistoryLogEntry.RequestType.ActiveDirectoryAuthenticate, success.ToString()); 
    } 
    return success; 

} 
catch (PrincipalServerDownException ex) 
{ 
    var displayMessage = string.Format("Please check your Web Service settings. {0} {1}", ex.Message, 
     ex.InnerException == null ? "" : ex.InnerException.Message); 

    messageHandler.WriteHistory(
     username, 
     HistoryLogEntry.OperationType.ActiveDirectory, 
     HistoryLogEntry.RequestType.ActiveDirectoryAuthenticate, 
     ex, displayMessage); 
    messageHandler.ThrowLastAsHttpError(); 

    return false; 
} 
finally 
{ 
    if (pc != null) 
    { 
     pc.Dispose(); 
    } 
} 

Antwort

0

Dummer Fehler meinerseits.

Die Web-Service-API stellt die validate-Anmeldeinformationen als GET-Anforderung bereit.

Sie müssen sich an die URL erinnern. Teilen Sie den Benutzernamen und das Passwort ein.

Vor allem das Passwort, da es Werte enthalten kann, die die Abfrage durcheinander bringen.

Die Leute mit komplexen Passwörtern versagten. Wo die einfachen Passwörter in Ordnung waren.

Edit: Ich ändere auch die Methode zu einem POST, um zu vermeiden, dass Benutzer den falschen Kodierungsmechanismus vergessen oder benutzen.

Verwandte Themen