检查 ASP.NET Core 中是否允许匿名

moo*_*ywu 6 c# authentication .net-core asp.net-core

我需要一种方法来检查“允许匿名”是否在控制器操作中打开/关闭。是否来自控制器属性,动作属性

[允许匿名]

或者在 MvcOptions 中设置为过滤器

opts.Filters.Add(new AllowAnonymousFilter());

是否可以?

Tan*_*jel 19

您似乎需要AllowAnonymousAttribute在请求期间检查控制器和操作是否确实包含来自您的自定义身份验证过滤器。所以你可以这样做:

public class CustomAuthorizationFilter : IAsyncAuthorizationFilter
{
    public async Task OnAuthorizationAsync(AuthorizationFilterContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException(nameof(filterContext));
        }

        bool hasAllowAnonymous = filterContext.ActionDescriptor.EndpointMetadata
                                 .Any(em => em.GetType() == typeof(AllowAnonymousAttribute)); //< -- Here it is

        if (hasAllowAnonymous) return;

        // Do your authorization check here
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 它也适用于 .NET 5.0!出色的。 (3认同)

phu*_*uzi 0

鉴于您评论中的额外信息。这似乎与您重置密码的方式相同。

对于密码重置,您可以在请求中包含一次性密码重置令牌(以及密码/验证密码等)。[AllowAnonymous]在更新任何详细信息并取消令牌之前,我将显式地装饰操作并验证令牌。

在你的情况下,我会做同样的事情 - 显式地装饰操作[AllowAnonymous]并验证一次性令牌。您的操作不应该关心AllowAnonymous过滤器是否已通过属性或选项应用于操作。

更新 经过多想,有一种简单的方法可以根据构建配置禁用此功能。将属性包装在#if 预处理器指令中,并创建定义条件编译符号的构建配置。详情请参阅此答案

#if DISABLE_ALLOW_ANONYOMOUS
    [AllowAnonymous]
#endif
    public IActionResult GetPicture(string token){
        ...
Run Code Online (Sandbox Code Playgroud)

然后,您可以构建禁用的测试特定版本AllowAnonymous

您也可以对 MvcOptions 执行相同的操作:

#if DISABLE_ALLOW_ANONYOMOUS
    opts.Filters.Add(new AllowAnonymousFilter());
#endif
Run Code Online (Sandbox Code Playgroud)