2013-03-25 18 views
10

私はLoginメソッドを含むWCFサービスを持っていますが、ローカルマシンの資格情報とユーザー名とパスワードを検証していて、一見無作為な時間が経過すると一部のユーザーは機能しなくなります。PrincipalContext.ValidateCredentialsを使用してローカルマシンに対して認証するとエラーが発生しますか?

実際のloginコマンドは次のようになります。

public UserModel Login(string username, string password, string ipAddress) 
{ 
    // Verify valid parameters 
    if (username == null || password == null) 
     return null; 

    try 
    { 
     using (var pContext = new PrincipalContext(ContextType.Machine)) 
     { 
      // Authenticate against local machine 
      if (pContext.ValidateCredentials(username, password)) 
      { 
       // Authenticate user against database 
       using (var context = new MyEntities(Connections.GetConnectionString())) 
       { 
        var user = (from u in context.Users 
           where u.LoginName.ToUpper() == username.ToUpper() 
             && u.IsActive == true 
             && (string.IsNullOrEmpty(u.AllowedIpAddresses) 
             || u.AllowedIpAddresses.Contains(ipAddress)) 
           select u).FirstOrDefault(); 

        // If user failed to authenticate against database 
        if (user == null) 
         return null; 

        // Map entity object to return object and assign session token 
        var userModel = Mapper.Map<User, UserModel>(user); 
        userModel.Token = Guid.NewGuid(); 
        userModel.LastActivity = DateTime.Now; 

        // Authenticated users are added to a list on the server 
        // and their login expires after 20 minutes of inactivity 
        authenticatedUsers.Add(userModel); 
        sessionTimer.Start(); 

        // User successfully authenticated, so return UserModel to client 
        return userModel; 
       } 
      } 
     } 
    } 
    catch(Exception ex) 
    { 
     // This is getting hit 
     MessageLog.WriteMessage(string.Format("Exception occurred while validating user: {0}\n{1}", ex.Message, ex.StackTrace)); 
     return null; 
    } 

    // If authentication against local machine failed, return null 
    return null; 
} 

これは、それが突然一部のユーザーのために作業を停止し、この例外をスローします、数日間正常に動作するように見える:

複数のユーザー名を使用して、同じユーザーによるサーバーまたは共有リソースへの複数の接続は許可されません。サーバまたは共有リソースへの以前のすべての接続を切断し、再試行してください。 (HRESULTからの例外:0x800704C3)

System.DirectoryServices.AccountManagement.CredentialValidator.BindSam(文字列対象文字列ユーザ名、文字列のパスワード)で

System.DirectoryServices.AccountManagement.CredentialValidator.Validate(文字列ユーザ名、でCでMyNamespace.LoginService.Login(文字列名、文字列のパスワード、文字列ipAddressの)でパスワード)System.DirectoryServices.AccountManagement.PrincipalContext.ValidateCredentialsで

(文字列ユーザ名、文字列のパスワード)

文字列:\ Users \ユーザーm E \ Desktopは\ somefolderはLoginService.svc.cs \:ライン67

ライン67である:if (pContext.ValidateCredentials(username, password))

それが重要かどうかはわからないんだけど、エラーメッセージの最後の行があります私の開発マシン上のVSソリューションのパスであり、本番サーバー上のファイルへのパスではありません。

失敗すると、一部のユーザーだけが失敗し、他のユーザーは正常にログインできます。私が一時的にエラーを修正するために見つけた唯一の事は、iisresetです。 Webサイトの停止/開始、またはアプリケーションプールのリサイクルは機能しません。

私はオンデマンドでエラーを再現できません。私は、複数のセッションやIPアドレスから同じユーザーでログインしようとしました。同時に同じブラウザセッションから別のユーザーにログインし、ログインボタンをスパムして複数回実行するようにしましたが、すべてが表示されますうまく動作する。

私は、ユーザーが過去にログインに成功できていることを私たちの伐採から見ることができます:ユーザーがFTPアクセスのためにローカルに作成したアカウントを持っているので、我々は、ローカルマシンに対して認証を行う理由がある

 
3/21/2013 
o 9:03a I logged in 
o 1:54p UserB logged in 
o 1:55p UserA logged in 
o 2:38p UserB logged in 
o 3:48p UserB logged in 
o 5:18p UserA logged in 
o 6:11p UserB logged in 

3/22/2013 
o 12:42p UserA logged in 
o 5:22p UserB logged in 
o 8:04p UserB logged in 

3/25/2013 (today) 
o 8:47a I logged in 
o 12:38p UserB tries logging in and fails. Repeated ~15 times over next 45 min 
o 1:58p I login successfully 
o 2:08p I try to login with UserB's login info and fail with the same error 

、および独自のカスタムログインシステムを構築したり、ユーザーに2つの資格情報を記憶させたりすることは望ましくありませんでした。

コードでは、ユーザーの資格情報を認証するだけで、ユーザーの資格情報では何もしません。 System.DirectoryServicesを使用する他のコードはありません。ファイルIOは実行されず、Webアプリケーションを実行するために必要なファイル以外のファイルシステム上のローカルにはアクセスできません。

数日後にこのエラーが一見無作為に表示される原因は何ですか?それをどうやって修正することができますか?

サーバはIIS 6.0を実行する、Windows Server 2003であり、そして私がこの問題を説明する方にオンラインで見つけることができます最も近いユーザーが同じエラーが発生しthis forum post、あるの.NET Framework 4.0

答えて

4

を使用するように設定されています

WinNTプロバイダはサーバー環境でうまく機能しません。私は ですが、これははるかに小さい負荷では表示されません実際に驚いています。私は を2人または3人のユーザーでしか入手できませんでした。書き込み@stephbuとして正しく誰かを認証するための最良の方法を

述べ

this SO commentはLogonUserAPI を使用することです。 「他のすべてのメソッドは、」トップがPrincipalContext.ValidateCredentialsは、Windows上で完全に100%信頼できるものではありませんように聞こえるPrincipalContext.ValidateCredentials

その使用の答えを投票含み、この記事で説明する他のすべてのメソッドはなりませ WORK 100%

Server 2003とIIS6.0のため、認証コードを書き換えてLogonUser WinAPIメソッドを代わりに使用しました。

[DllImport("advapi32.dll", SetLastError = true)] 
public static extern bool LogonUser(
    string lpszUsername, 
    string lpszDomain, 
    string lpszPassword, 
    int dwLogonType, 
    int dwLogonProvider, 
    out IntPtr phToken 
    ); 

IntPtr hToken; 
if (LogonUser(username, "", password, 
    LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, out hToken)) 
{ 
    ... 
} 
+0

私は数時間を無駄にしました、感謝のrachel、 –

関連する問題