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

时间:2020-03-04 10:06:47

标签: c# authentication asp.net-core .net-core

我需要一种方法来检查控制器操作中是否启用了“允许匿名”。是否来自控制器属性,动作属性

[AllowAnonymous]

,或者在MvcOptions中将其设置为过滤器

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

有可能吗?

谢谢!

3 个答案:

答案 0 :(得分:10)

在请求期间,您似乎需要检查自定义身份验证过滤器中的控制器和操作是否确实包含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
    }
}

答案 1 :(得分:0)

在评论中提供其他信息。这似乎与您应该重设密码的方式相同。

对于密码重置,您在请求中包括一个一次性的密码重置令牌(以及密码/已验证的密码等)。我将使用[AllowAnonymous]明确修饰该动作,并在更新之前验证令牌任何详细信息并取消令牌。

在您的情况下,我会做同样的事情-用[AllowAnonymous]显式装饰动作并验证一次性令牌。您的操作无需理会是否通过属性或选项将AllowAnonymous过滤器应用于操作。

更新 想了一点,有一种简单的方法可以根据构建配置禁用此功能。将属性包装在#if preprocessor directive中,并创建定义条件补全符号的构建配置。有关详情,请参见this answer

#if DISABLE_ALLOW_ANONYOMOUS
    [AllowAnonymous]
#endif
    public IActionResult GetPicture(string token){
        ...

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

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

#if DISABLE_ALLOW_ANONYOMOUS
    opts.Filters.Add(new AllowAnonymousFilter());
#endif

答案 2 :(得分:0)

public class MyController : Controller
{
    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        var anonActionAttributes = filterContext.ActionDescriptor
            .GetCustomAttributes(typeof(System.Web.Mvc.AllowAnonymousAttribute), true);

        var anonControllerAttributes = filterContext.ActionDescriptor.ControllerDescriptor
            .GetCustomAttributes(typeof(System.Web.Mvc.AllowAnonymousAttribute), true);

        if (anonActionAttributes.Length > 0 || anonControllerAttributes.Length > 0)            
            IsAllowAnonymous = true;

        base.OnAuthorization(filterContext);
    }

    bool IsAllowAnonymous { get; set; } = false;    
}

如果您认为此答案有帮助,请对其进行投票。

相关问题