2012-09-12 15 views
10

古くなった記事ですが、http://msdn.microsoft.com/en-us/library/ff650308.aspx#paght000026_step3は私がしたいことを示しています。私は、シンプルさと低儀式のアプローチのために私のWebフレームワークとしてNancyを選択しました。だから、Nancyを使ってActive Directoryに対して認証する方法が必要です。NancyのActive Directoryに対してどのように認証できますか?

ASP.NETでは、web.configファイルの設定によっては、dbベースのメンバーシッププロバイダとActive Directoryを切り替えることができるようです。私はそれを具体的に必要としませんが、開発者とプロダクションを切り替える機能は素晴らしいでしょう。

どうすればいいですか?

+1

が、私はそれに貢献することがあります。..任意の手引き方向は助けにもなる。 –

+0

ナンシーレポに問題を追加しました:https://github.com/NancyFx/Nancy/issues/742 –

答えて

13

本当に解決策は、実際よりもはるかに単純です。 Active Directoryを(データベースのように)ユーザーのためのリポジトリと考えてください。入力したユーザー名とパスワードが有効であることを照会するには、ADを照会するだけです。そう、ナンシーのフォーム検証を使用して、IUserMapperの実装でADへの接続を処理してください。ここで私は私のユーザーマッパーのために思い付いたものです:

public class ActiveDirectoryUserMapper : IUserMapper, IUserLoginManager 
{ 
    static readonly Dictionary<Guid, long> LoggedInUserIds = new Dictionary<Guid, long>(); 

    readonly IAdminUserValidator _adminUserValidator; 
    readonly IAdminUserFetcher _adminUserFetcher; 
    readonly ISessionContainer _sessionContainer; 

    public ActiveDirectoryUserMapper(IAdminUserValidator adminUserValidator, IAdminUserFetcher adminUserFetcher, ISessionContainer sessionContainer) 
    { 
     _adminUserValidator = adminUserValidator; 
     _adminUserFetcher = adminUserFetcher; 
     _sessionContainer = sessionContainer; 
    } 

    public IUserIdentity GetUserFromIdentifier(Guid identifier, NancyContext context) 
    { 
     _sessionContainer.OpenSession(); 
     var adminUserId = LoggedInUserIds.First(x => x.Key == identifier).Value; 
     var adminUser = _adminUserFetcher.GetAdminUser(adminUserId); 
     return new ApiUserIdentity(adminUser); 
    } 

    public Guid Login(string username, string clearTextPassword, string domain) 
    { 
     var adminUser = _adminUserValidator.ValidateAndReturnAdminUser(username, clearTextPassword, domain); 
     var identifier = Guid.NewGuid(); 
     LoggedInUserIds.Add(identifier, adminUser.Id); 
     return identifier; 
    } 
} 

私は役割を処理するために、私のデータベースのレコードを維持していますので、このクラスのハンドルがADを検証し、データベースからユーザーをフェッチ:

public class AdminUserValidator : IAdminUserValidator 
{ 
    readonly IActiveDirectoryUserValidator _activeDirectoryUserValidator; 
    readonly IAdminUserFetcher _adminUserFetcher; 

    public AdminUserValidator(IAdminUserFetcher adminUserFetcher, 
           IActiveDirectoryUserValidator activeDirectoryUserValidator) 
    { 
     _adminUserFetcher = adminUserFetcher; 
     _activeDirectoryUserValidator = activeDirectoryUserValidator; 
    } 

    #region IAdminUserValidator Members 

    public AdminUser ValidateAndReturnAdminUser(string username, string clearTextPassword, string domain) 
    { 
     _activeDirectoryUserValidator.Validate(username, clearTextPassword, domain); 

     return _adminUserFetcher.GetAdminUser(1);    
    } 

    #endregion 
} 

そして、このクラスは、実際のユーザー名/パスワードの組み合わせがActive Directoryに存在することを確認しますという点で、これが利用できない場合は、今、ところで

public class ActiveDirectoryUserValidator : IActiveDirectoryUserValidator 
{ 
    public void Validate(string username, string clearTextPassword, string domain) 
    { 
     using (var principalContext = new PrincipalContext(ContextType.Domain, domain)) 
     { 
      // validate the credentials 
      bool isValid = principalContext.ValidateCredentials(username, clearTextPassword); 
      if (!isValid) 
       throw new Exception("Invalid username or password."); 
     } 

    } 
} 
+0

マイナーニックピック: 'LoggedInUserIds.First(x => x.Key == identifier).Value'の代わりにLoggedInUserIds [identifier] 'を実行できませんでしたか?また、 'Login'メソッドで' LoggedInUserIds [identifier] = adminUser.Id'を実行します。 –

+0

これはNuget Nancy.ActiveDirectoryAuthenticationパッケージとして作成できますか? – pashute

+0

ナンシーの問題トラッカー(この回答に戻る)に@pashute [ADディスカッション](https://github.com/NancyFx/Nancy/issues/742) – Omni

関連する問題