12

これは時代遅れの記事ですが、http://msdn.microsoft.com/en-us/library/ff650308.aspx#paght000026_step3は、私がやりたいことを示しています。私がNancyを Web フレームワークとして選んだのは、その単純さと控えめなアプローチのためです。したがって、 Nancyを使用して Active Directory に対して認証する方法が必要です。

ASP.NET では、web.config ファイルのいくつかの設定だけで、db ベースのメンバーシップ プロバイダーと Active Directory を切り替えることができるようです。具体的には必要ありませんが、開発と本番を切り替える機能は素晴らしいでしょう。

これはどのように行うことができますか?

4

1 に答える 1

15

実際の解決策は、見た目よりもはるかに簡単です。Active Directory は、ユーザーのリポジトリ (データベースと同様) と考えてください。AD にクエリを実行して、入力したユーザー名とパスワードが有効であることを確認するだけです。SO、ナンシーのフォーム検証を使用して、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.");
        }

    }
}
于 2012-09-28T17:06:39.410 に答える