Skip to content

Commit

Permalink
Merge pull request #47 from MultifactorLab/feature/dev-135
Browse files Browse the repository at this point in the history
Always check membership on behalf of the process user
  • Loading branch information
ivan-timofeev authored Jul 1, 2024
2 parents ef45d6f + 29d7faf commit 555983c
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 22 deletions.
18 changes: 12 additions & 6 deletions MultiFactor.Radius.Adapter/Server/RadiusRouter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,7 @@ public async Task HandleRequest(PendingRequest request)
if (request.AuthenticationState.SecondFactor == AuthenticationCode.Awaiting)
{
var code = await ProcessSecondAuthenticationFactor(request);

if (code == PacketCode.AccessChallenge)
{
request.ResponseCode = request.AuthenticationState.GetResultPacketCode();
Expand All @@ -223,7 +224,17 @@ public async Task HandleRequest(PendingRequest request)
return;
}

if (code != PacketCode.AccessAccept)
if (code == PacketCode.AccessAccept)
{
_logger.Information("Second factor accepted for user '{user:l}' from {host:l}:{port}",
request.UserName, request.RemoteEndpoint.Address, request.RemoteEndpoint.Port);
request.AuthenticationState.SetSecondFactor(AuthenticationCode.Accept);
request.ResponseCode = request.AuthenticationState.GetResultPacketCode();
CreateAndSendRadiusResponse(request);
return;
}

if (code == PacketCode.AccessReject)
{
_logger.Information("Second factor rejected for user '{user:l}' from {host:l}:{port}",
request.UserName, request.RemoteEndpoint.Address, request.RemoteEndpoint.Port);
Expand All @@ -232,11 +243,6 @@ public async Task HandleRequest(PendingRequest request)
CreateAndSendRadiusResponse(request);
return;
}

request.AuthenticationState.SetSecondFactor(AuthenticationCode.Accept);
request.ResponseCode = request.AuthenticationState.GetResultPacketCode();
CreateAndSendRadiusResponse(request);
return;
}

request.ResponseCode = request.AuthenticationState.GetResultPacketCode();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,13 +84,8 @@ public bool VerifyCredentialAndMembership(PendingRequest request)

try
{
_logger.Debug("Verifying user '{User:l}' credential and status at {Domain:l}", user, _domain);

using (var connection = _connectionFactory.Create(_domain, user.Name, request.Passphrase.Password))
{
_logger.Information("User '{User:l}' credential and status verified successfully in {Domain:l}", user, _domain);
return VerifyMembership(request.Configuration, connection, _domain, user, request);
}
VerifyCredential(user, request);
return VerifyMembership(request.Configuration, user, request);
}
catch (LdapException lex)
{
Expand Down Expand Up @@ -193,17 +188,25 @@ public bool ChangePassword(PendingRequest request, string currentPassword, out b
return false;
}

private bool VerifyMembership(ClientConfiguration clientConfig, LdapConnection connection, string userDomain, LdapIdentity user, PendingRequest request)
private bool VerifyMembership(ClientConfiguration clientConfig, LdapIdentity user, PendingRequest request)
{
var domain = LdapIdentity.FqdnToDn(userDomain);
var schema = _forestMetadataCache.Get(
clientConfig.Name,
domain,
() => new ForestSchemaLoader(clientConfig, connection, _logger).Load(domain));
var profile = new ProfileLoader(schema, _logger).LoadProfile(clientConfig, connection, domain, user);
if (profile == null)
var domain = LdapIdentity.FqdnToDn(_domain);

LdapProfile profile;

using (var connection = _connectionFactory.CreateAsCurrentProcessUser(_domain))
{
return false;
var forestSchema = _forestMetadataCache.Get(
clientConfig.Name,
domain,
() => new ForestSchemaLoader(clientConfig, connection, _logger).Load(domain));

profile = new ProfileLoader(forestSchema, _logger).LoadProfile(clientConfig, connection, domain, user);

if (profile == null)
{
return false;
}
}

//user must be member of security group
Expand Down Expand Up @@ -264,6 +267,16 @@ private bool VerifyMembership(ClientConfiguration clientConfig, LdapConnection c
return true;
}

private void VerifyCredential(LdapIdentity user, PendingRequest request)
{
_logger.Debug("Verifying user '{User:l}' credential and status at {Domain:l}", user, _domain);

using (_ = _connectionFactory.Create(_domain, user.Name, request.Passphrase.Password))
{
_logger.Information("User '{User:l}' credential and status verified successfully in {Domain:l}", user, _domain);
}
}

private bool IsMemberOf(LdapProfile profile, string group)
{
return profile.MemberOf?.Any(g => g.ToLower() == group.ToLower().Trim()) ?? false;
Expand Down

0 comments on commit 555983c

Please sign in to comment.