elsa-core/test/unit/Elsa.Identity.UnitTests/Features/DefaultAuthenticationFeatureTests.cs
Sipke Schoorstra d23e61e9be
[codex] Require opt-in for localhost authorization grants (#7498)
* Require opt-in for localhost auth grant

* Preserve custom authorization configuration

* Address localhost auth review feedback

* Address localhost bootstrap review comments
2026-05-21 00:40:57 +02:00

86 lines
3.2 KiB
C#

using Elsa.Features.Services;
using Elsa.Identity.Features;
using Elsa.Requirements;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Authorization.Infrastructure;
using NSubstitute;
namespace Elsa.Identity.UnitTests.Features;
public class DefaultAuthenticationFeatureTests
{
[Fact]
public void DefaultSecurityRootPolicyRequiresAuthenticatedUser()
{
var feature = new DefaultAuthenticationFeature(Substitute.For<IModule>());
var options = new AuthorizationOptions();
feature.ConfigureAuthorizationOptions(options);
var policy = options.GetPolicy(IdentityPolicyNames.SecurityRoot);
Assert.NotNull(policy);
Assert.Contains(policy.Requirements, requirement => requirement is DenyAnonymousAuthorizationRequirement);
Assert.DoesNotContain(policy.Requirements, requirement => requirement is LocalHostPermissionRequirement);
}
[Fact]
public void EnableLocalHostPermissionGrantForSecurityRootConfiguresExplicitLocalhostPolicy()
{
var feature = new DefaultAuthenticationFeature(Substitute.For<IModule>());
var options = new AuthorizationOptions();
feature.EnableLocalHostPermissionGrantForSecurityRoot();
feature.ConfigureAuthorizationOptions(options);
var policy = options.GetPolicy(IdentityPolicyNames.SecurityRoot);
Assert.True(feature.EnableLocalHostPermissionGrant);
Assert.NotNull(policy);
Assert.Contains(policy.Requirements, requirement => requirement is LocalHostPermissionRequirement);
}
[Fact]
public void EnableLocalHostPermissionGrantDoesNotOverwriteCustomAuthorizationConfiguration()
{
var feature = new DefaultAuthenticationFeature(Substitute.For<IModule>());
feature.ConfigureAuthorizationOptions = options => options.AddPolicy("Custom", policy => policy.RequireAuthenticatedUser());
feature.EnableLocalHostPermissionGrantForSecurityRoot();
var options = new AuthorizationOptions();
feature.ConfigureAuthorizationOptions(options);
Assert.True(feature.EnableLocalHostPermissionGrant);
Assert.NotNull(options.GetPolicy("Custom"));
Assert.Null(options.GetPolicy(IdentityPolicyNames.SecurityRoot));
}
[Fact]
public void NullConfigureAuthorizationOptionsFallsBackToDefaultSecurityRootPolicy()
{
var feature = new DefaultAuthenticationFeature(Substitute.For<IModule>())
{
ConfigureAuthorizationOptions = null!
};
var options = new AuthorizationOptions();
feature.ConfigureAuthorizationOptions(options);
var policy = options.GetPolicy(IdentityPolicyNames.SecurityRoot);
Assert.NotNull(policy);
Assert.Contains(policy.Requirements, requirement => requirement is DenyAnonymousAuthorizationRequirement);
}
[Fact]
public void DisableLocalHostPermissionGrantForSecurityRootClearsOptInFlag()
{
var feature = new DefaultAuthenticationFeature(Substitute.For<IModule>());
feature.EnableLocalHostPermissionGrantForSecurityRoot();
feature.DisableLocalHostPermissionGrantForSecurityRoot();
Assert.False(feature.EnableLocalHostPermissionGrant);
}
}