是否可以编写一个可以测试 AuthorizationPolicy 对象的测试?

chr*_*389 5 c# authorization .net-core asp.net-core

我有一个策略想要在 C# 中测试

public class WorkflowCreatePolicy
{
    public AuthorizationPolicy AuthorizationPolicy =>
        new AuthorizationPolicyBuilder()
            .RequireClaim("scope", "WorkflowAdmin")
            .Build();
}
Run Code Online (Sandbox Code Playgroud)

有谁知道一种方法来测试 AuthorizationPolicy 来确认范围“WorkflowAdmin”成功而所有其他范围都失败?

这是我检查对象时看到的:

在此输入图像描述

我设法找到这个网站:授权处理程序单元测试,但它谈论测试处理程序,并且具有将身份验证尝试标记为成功的代码。

我不确定这是否正在接近。目前还没有通过

[Test]
public void GivenPolicyName_WhenICallPolicyChecks_ThenItPasses()
{
    ClaimsPrincipal user = new ClaimsPrincipal(new ClaimsIdentity(new List<Claim> { new Claim(CustomClaims.Scope, "WorkflowAdmin") }));

    WorkflowCreatePolicy workflowCreatePolicy = new WorkflowCreatePolicy();

    AuthorizationHandlerContext authorizationHandlerContext = new AuthorizationHandlerContext(workflowCreatePolicy.AuthorizationPolicy.Requirements, user, null);

    Assert.That(authorizationHandlerContext.HasSucceeded, Is.EqualTo(true));
}
Run Code Online (Sandbox Code Playgroud)

spo*_*ahn 8

请参阅ASP.NET Core 安全单元测试中的此测试。我从中汲取了模式并将其应用到您的保单中。

[Fact]
public async Task ShouldAllowIfScopeClaimWorkflowAdminIsPresent()
{
    // Arrange
    var authorizationService = BuildAuthorizationService(services =>
    {
        services.AddAuthorization(options =>
        {
            options.AddPolicy("SomePolicyName", new WorkflowCreatePolicy()
               .AuthorizationPolicy);
        });
    });
    var user = new ClaimsPrincipal(new ClaimsIdentity(
        new Claim[] { new Claim("scope", "WorkflowAdmin") }));

    // Act
    var allowed = await authorizationService.AuthorizeAsync(user, "SomePolicyName");

    // Assert
    Assert.True(allowed.Succeeded);
}
Run Code Online (Sandbox Code Playgroud)
private IAuthorizationService BuildAuthorizationService(
    Action<IServiceCollection> setupServices = null)
{
    var services = new ServiceCollection();
    services.AddAuthorization();
    services.AddLogging();
    services.AddOptions();
    setupServices?.Invoke(services);
    return services.BuildServiceProvider().GetRequiredService<IAuthorizationService>();
}
Run Code Online (Sandbox Code Playgroud)