在 ASP.NET 核心授权策略中使用 .RequireRole() 而不使用 .RequireAuthenticatedUser() 是否安全?

Is it safe to use .RequireRole() without .RequireAuthenticatedUser() in ASP.NET Core authorization policies?

Startup.cs 中定义了一些策略,例如:

services.AddAuthorization(options =>
{
    options.AddPolicy("UsersEdit", policy => policy
        .RequireAuthenticatedUser()
        .RequireRole("Admin"));
});

将此代码重写为:

是否安全
services.AddAuthorization(options =>
{
    options.AddPolicy("UsersEdit", policy => policy.RequireRole("Admin"));
});

我想未经授权的用户不能有任何角色。

如果我们检查 RequireAuthenticatedUserhttps://github.com/aspnet/AspNetCore/blob/c376e833e46497fbec4bd7b39632f8c8e13360b2/src/Security/Authorization/Core/src/DenyAnonymousAuthorizationRequirement.cs 添加的授权要求的源代码:

var user = context.User;
var userIsAnonymous =
    user?.Identity == null ||
    !user.Identities.Any(i => i.IsAuthenticated);
    if (!userIsAnonymous)
    {
        context.Succeed(requirement);
    }

它添加了一项检查,即用户必须具有身份,并且其中之一必须表明用户已通过身份验证。

IsAuthenticateddocs 中表示以下内容:

true if the AuthenticationType property is not null or an empty string.

因此理论上,用户可以通过拥有没有身份验证类型的身份来发挥作用。 但在实践中,这不应该发生。 任何合理的身份验证处理程序都不会将 AuthenticationType 留空,因为那时 IsAuthenticated 会 return false.