mirror of
https://github.com/bitwarden/server.git
synced 2025-04-24 06:25:09 -05:00

* Add RequireSsoPolicyRequirement and its factory to enforce SSO policies * Enhance WebAuthnController to support RequireSsoPolicyRequirement with feature flag integration. Update tests to validate behavior when SSO policies are applicable. * Integrate IPolicyRequirementQuery into request validators to support RequireSsoPolicyRequirement. Update validation logic to check SSO policies based on feature flag. * Refactor RequireSsoPolicyRequirementFactoryTests to improve test coverage for SSO policies. Add tests for handling both valid and invalid policies in CanUsePasskeyLogin and SsoRequired methods. * Remove ExemptStatuses property from RequireSsoPolicyRequirementFactory to use default values from BasePolicyRequirementFactory * Restore ValidateRequireSsoPolicyDisabledOrNotApplicable * Refactor RequireSsoPolicyRequirement to update CanUsePasskeyLogin and SsoRequired properties to use init-only setters * Refactor RequireSsoPolicyRequirementFactoryTests to enhance test clarity * Refactor BaseRequestValidatorTests to improve test clarity * Refactor WebAuthnController to replace SSO policy validation with PolicyRequirement check * Refactor BaseRequestValidator to replace SSO policy validation with PolicyRequirement check * Refactor WebAuthnControllerTests to update test method names and adjust policy requirement checks * Add tests for AttestationOptions and Post methods in WebAuthnControllerTests to validate scenario where SSO is not required * Refactor RequireSsoPolicyRequirement initialization * Refactor SSO requirement check for improved readability * Rename test methods in RequireSsoPolicyRequirementFactoryTests for clarity on exempt status conditions * Update RequireSsoPolicyRequirement to refine user status checks for SSO policy requirements
141 lines
4.7 KiB
C#
141 lines
4.7 KiB
C#
using System.Security.Claims;
|
|
using Bit.Core.AdminConsole.OrganizationFeatures.Policies;
|
|
using Bit.Core.AdminConsole.Services;
|
|
using Bit.Core.Auth.Repositories;
|
|
using Bit.Core.Context;
|
|
using Bit.Core.Entities;
|
|
using Bit.Core.Repositories;
|
|
using Bit.Core.Services;
|
|
using Bit.Core.Settings;
|
|
using Bit.Identity.IdentityServer;
|
|
using Bit.Identity.IdentityServer.RequestValidators;
|
|
using Duende.IdentityServer.Models;
|
|
using Duende.IdentityServer.Validation;
|
|
using Microsoft.AspNetCore.Identity;
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
namespace Bit.Identity.Test.Wrappers;
|
|
|
|
public class BaseRequestValidationContextFake
|
|
{
|
|
public ValidatedTokenRequest ValidatedTokenRequest;
|
|
public CustomValidatorRequestContext CustomValidatorRequestContext;
|
|
public GrantValidationResult GrantResult;
|
|
|
|
public BaseRequestValidationContextFake(
|
|
ValidatedTokenRequest tokenRequest,
|
|
CustomValidatorRequestContext customValidatorRequestContext,
|
|
GrantValidationResult grantResult)
|
|
{
|
|
ValidatedTokenRequest = tokenRequest;
|
|
CustomValidatorRequestContext = customValidatorRequestContext;
|
|
GrantResult = grantResult;
|
|
}
|
|
}
|
|
|
|
interface IBaseRequestValidatorTestWrapper
|
|
{
|
|
Task ValidateAsync(BaseRequestValidationContextFake context);
|
|
}
|
|
|
|
public class BaseRequestValidatorTestWrapper : BaseRequestValidator<BaseRequestValidationContextFake>,
|
|
IBaseRequestValidatorTestWrapper
|
|
{
|
|
|
|
/*
|
|
* Some of the logic trees call `ValidateContextAsync`. Since this is a test wrapper, we set the return value
|
|
* of ValidateContextAsync() to whatever we need for the specific test case.
|
|
*/
|
|
public bool isValid { get; set; }
|
|
public BaseRequestValidatorTestWrapper(
|
|
UserManager<User> userManager,
|
|
IUserService userService,
|
|
IEventService eventService,
|
|
IDeviceValidator deviceValidator,
|
|
ITwoFactorAuthenticationValidator twoFactorAuthenticationValidator,
|
|
IOrganizationUserRepository organizationUserRepository,
|
|
IMailService mailService,
|
|
ILogger logger,
|
|
ICurrentContext currentContext,
|
|
GlobalSettings globalSettings,
|
|
IUserRepository userRepository,
|
|
IPolicyService policyService,
|
|
IFeatureService featureService,
|
|
ISsoConfigRepository ssoConfigRepository,
|
|
IUserDecryptionOptionsBuilder userDecryptionOptionsBuilder,
|
|
IPolicyRequirementQuery policyRequirementQuery) :
|
|
base(
|
|
userManager,
|
|
userService,
|
|
eventService,
|
|
deviceValidator,
|
|
twoFactorAuthenticationValidator,
|
|
organizationUserRepository,
|
|
mailService,
|
|
logger,
|
|
currentContext,
|
|
globalSettings,
|
|
userRepository,
|
|
policyService,
|
|
featureService,
|
|
ssoConfigRepository,
|
|
userDecryptionOptionsBuilder,
|
|
policyRequirementQuery)
|
|
{
|
|
}
|
|
|
|
public async Task ValidateAsync(
|
|
BaseRequestValidationContextFake context)
|
|
{
|
|
await ValidateAsync(context, context.ValidatedTokenRequest, context.CustomValidatorRequestContext);
|
|
}
|
|
|
|
protected override ClaimsPrincipal GetSubject(
|
|
BaseRequestValidationContextFake context)
|
|
{
|
|
return context.ValidatedTokenRequest.Subject ?? new ClaimsPrincipal();
|
|
}
|
|
|
|
protected override void SetErrorResult(
|
|
BaseRequestValidationContextFake context,
|
|
Dictionary<string, object> customResponse)
|
|
{
|
|
context.GrantResult = new GrantValidationResult(TokenRequestErrors.InvalidGrant, customResponse: customResponse);
|
|
}
|
|
|
|
protected override void SetSsoResult(
|
|
BaseRequestValidationContextFake context,
|
|
Dictionary<string, object> customResponse)
|
|
{
|
|
context.GrantResult = new GrantValidationResult(
|
|
TokenRequestErrors.InvalidGrant, "Sso authentication required.", customResponse);
|
|
}
|
|
|
|
protected override Task SetSuccessResult(
|
|
BaseRequestValidationContextFake context,
|
|
User user,
|
|
List<Claim> claims,
|
|
Dictionary<string, object> customResponse)
|
|
{
|
|
context.GrantResult = new GrantValidationResult(customResponse: customResponse);
|
|
return Task.CompletedTask;
|
|
}
|
|
|
|
protected override void SetTwoFactorResult(
|
|
BaseRequestValidationContextFake context,
|
|
Dictionary<string, object> customResponse)
|
|
{ }
|
|
|
|
protected override void SetValidationErrorResult(
|
|
BaseRequestValidationContextFake context,
|
|
CustomValidatorRequestContext requestContext)
|
|
{ }
|
|
|
|
protected override Task<bool> ValidateContextAsync(
|
|
BaseRequestValidationContextFake context,
|
|
CustomValidatorRequestContext validatorContext)
|
|
{
|
|
return Task.FromResult(isValid);
|
|
}
|
|
}
|