2016-03-29 9 views
1

私は把握しようとしている本当に奇妙な動作があります。PrincipalContext ValidateCredentialsは、Web APIで使用されると一部のユーザーに失敗する

次のコードに従って、Active Directoryに対してユーザーの資格情報を検証するために使用されるIISで実行されるASP.NET 4.5 Web APIがあります。

ADの一部のユーザーでは機能しますが、ADの他のユーザーには常にfalseが返されます。私のカスタムmessageHandlerのログから、私はそれがmessageHandler.WriteSuccessの部分に到達していることを知っています。だから私はそれが例外をスローしていないことを知っている。

ウェブサーバーで同じコードを使用してWindowsフォームデスクトップアプリケーションを作成して問題のトラブルシューティングを支援しましたが、すべてのユーザーを正しく検証します。

これは、ASP.NET Web APIがネットワークサービスとして実行されている可能性があります。私は、Webサーバーにログインしたときと同じIDを使用するようにアプリケーションプールを変更しましたが、違いはありませんでした。

なぜ完全に同じコードがWindowsフォームアプリケーションで正しくユーザーを検証しますが、ASP.net Web APIでは一部のユーザーのみが正しく検証されるのでしょうか。

回避策として、ネットワーク管理者は、ログインに失敗したユーザーのために新しいADユーザーを作成しています。これは機能しています。失敗したADユーザと成功したADユーザとの間にはいくつかの違いがある。

また、IISの実行と比較して、デスクトップアプリケーションとして実行すると、同じコードが異なる動作をすることは非常に奇妙です。

これ以上問題を解決する方法や問題を解決する方法はありますか? サーバーは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(); 
    } 
} 

答えて

0

愚かな間違いです。

WebサービスAPIは、資格情報の検証メソッドをGET要求として公開します。

ユーザー名とパスワードの部分をURLエンコードすることを覚えておく必要があります。

特に、パスワードにはクエリを混乱させるような値を含めることができます。

複雑なパスワードを持つ人が失敗していました。簡単なパスワードが大丈夫だった場所

編集:私はまた、ユーザーが間違ったエンコーディングメカニズムを忘れたり使用したりしないように、メソッドをPOSTに変更しています。

関連する問題