Thực sự giải pháp đơn giản hơn nhiều so với khả năng của nó. Chỉ cần nghĩ về Active Directory như một kho lưu trữ cho người dùng của bạn (giống như một cơ sở dữ liệu). Tất cả những gì bạn cần làm là truy vấn AD để xác minh rằng tên người dùng và mật khẩu đã nhập là hợp lệ. SO, chỉ cần sử dụng Xác nhận biểu mẫu của Nancy và xử lý sự kết nối với AD trong việc triển khai IUserMapper của bạn. Dưới đây là những gì tôi đã đưa ra cho mapper người dùng của tôi:
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;
}
}
Tôi đang giữ một kỷ lục trong cơ sở dữ liệu của tôi để xử lý vai trò, vì vậy lớp này handle xác minh với AD và lấy người sử dụng từ cơ sở dữ liệu:
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
}
Và lớp này thực sự xác nhận rằng sự kết hợp giữa tên người dùng/mật khẩu tồn tại trong 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.");
}
}
}
Nguồn
2012-09-28 17:06:39
Bằng cách này, nếu điều này không có sẵn ngay bây giờ, tôi sẽ góp phần nó .. bất cứ hướng dẫn tại đó hướng sẽ cũng hữu ích. –
Tôi vừa thêm một vấn đề vào repo Nancy: https://github.com/NancyFx/Nancy/issues/742 –