以编程方式将 [AllowAnonymous] 属性添加到我的所有控制器方法

2023-12-11

我有一个带有多个控制器的 WebAPI2 REST api。我使用基于角色的身份验证。我在所有控制器和一些方法上添加了 [Authorize] 属性。但是,在 DEV 环境中我想禁用身份验证。我希望我可以将一些代码放入WebApiConfig例如:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
        config.EnableCors(new EnableCorsAttribute("*", "*", "*"));

        //==============================================
        // NOTE: disable all authentication in the DEV_ENVIRONMENT

        if (Environment.GetEnvironmentVariable("DEV_ENVIRONMENT") == "1")
        {
            config.Filters.Add(new AllowAnonymousAttribute());
        }
    }
}

但是,这不能编译,因为

error CS1503: Argument 1: cannot convert from 
'System.Web.Http.AllowAnonymousAttribute' to 
'System.Web.Http.Filters.IFilter'

有没有办法在运行时关闭 REST api 中的所有身份验证?


我不会“删除”授权。假设您有一个客户,并且 CustomerId 是一个声明,那么您无法测试代码,因为缺少声明。相反,我会选择添加一个身份用于开发目的。

这可能是一个黑客,但我的策略是添加一个过滤器,其中设置当前用户,包括所需的角色:

using System.Security.Principal;
using System.Web;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;

public class AddIdentityFilter : AuthorizationFilterAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        HttpContext.Current.User = new GenericPrincipal(new GenericIdentity("John"), new[] { "Admin" });
        base.OnAuthorization(actionContext);
    }
}

在 WebApiConfig.cs 中添加过滤器:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.SuppressDefaultHostAuthentication();

        // Add some logic here to determine the environment
        var isDevelopment = true;

        if (isDevelopment)
            config.Filters.Add(new AddIdentityFilter());

        // ...
    }

这样您就可以在开发时定义多个测试场景。


这是一个类似的方法ASP.NET核心3.0应用程序。在启动.配置中:

if (env.IsDevelopment())
{
    // Custom authentication
    app.Use(async (context, next) =>
    {
        // Set claims for the test user.
        var claims = new[] { new Claim("role", "Admin"), new Claim("sub", "some guid") };
        var id = new ClaimsIdentity(claims, "DebugAuthorizationMiddleware", "name", "role");
        // Add the test user as Identity.
        context.User.AddIdentity(id);
        // User is now authenticated.
        await next.Invoke();
    });
}
else
{
    // use configured authentication
    app.UseAuthentication();
}
app.UseAuthorization();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以编程方式将 [AllowAnonymous] 属性添加到我的所有控制器方法 的相关文章

随机推荐

  • Android 数字选择器对话框 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 有没有人有任何对话框允许用户选择一定范围内的数字 这似乎是一个相当普遍的需求 但我找不到它的通用对话框 而且我不想花时间创建自己的对话框 有什么帮助吗 我知道两年多过去了 但答案仍然
  • ruby 如何允许方法和类同名?

    我碰巧正在用 ruby 开发 Singleton 类 只记得它的工作方式工厂女工 他们解决了这个问题 所以你可以同时使用漫长的路 Factory create and 捷径 Factory 我想了想 很好奇他们是如何上课的Factory也表
  • Cygwin编码困难

    不确定这是否是一个编程问题 我开始怀疑是这样 但后来我在 Windows 控制台而不是 Cygwin 控制台中运行了有问题的 Java 程序 可执行 jar 并且它运行良好 输出重音良好 重音输入接受良好 因此以下内容仅适用于 Cygwin
  • kernel.h中min宏中的“(void)(&_min1 == &_min2)”的作用是什么?

    In kernel h分钟定义为 define min x y typeof x min1 x typeof y min2 y void min1 min2 min1 lt min2 min1 min2 我不明白那条线是什么 void mi
  • 在 SimpleInjector 中使用 IAuthorizationFilter 进行依赖注入

    我有课PermissionFilter实现IAuthorizationFilter from System Web Mvc 由于它具有已映射的依赖项 因此我想使用 SimpleInjector 来提供它 我正在这样做 与 Ninject 合
  • 嵌套 ES6 类?

    似乎可以将类嵌套在构造函数中 然后可以从类中的任何位置实例化 这是官方的吗 编辑 例如 class C constructor class D constructor method var a new D works fine var a
  • 跨域AJAX withCredentials,PHP返回标头内容长度,但没有内容

    我正在尝试从一个域上的页面向另一个域上的 PHP 服务器发送跨域请求 没有凭据 一切都可以正常工作 我需要一个会话 但一旦添加凭据 它就不起作用 这是JS代码 var xhr new XMLHttpRequest xhr open GET
  • 使用 $_GET 字符串传递换行符

    我必须将字符串传递给表单 我想按以下方式混合使用 GET 和 POST
  • ViewBox 内的 WPF TextBox 在调整大小时丢失光标

    我在视图框中有一个文本框 当我尝试调整窗口大小时 文本框大小和字体大小会缩放 但如果我尝试聚焦文本框并尝试使用键盘在文本框中移动光标 有时光标会消失 有没有办法始终显示光标 请参考下面的代码 其中 ViewBox 内有一个 TextBox
  • boost/archive/binary_woarchive.hpp 和/或 boost/archive/binary_wiarchive.hpp 的序列化示例?

    我试图找到一个很好的例子来说明如何使用 boost 序列化内容的这些二进制宽字符版本 我拼凑了一些代码来尝试让它工作 但不幸的是 在尝试编译它时 我遇到了链接器错误 这是我的代码 以防我做任何明显错误的事情 include
  • 处理子例程中重复出现的 VBA 错误

    我被困在我有解决方法的事情上 但这让我烦恼我没有关于如何解决使用问题的直接答案On Error Goto对于重复出现的错误 我的问题本质上是一样的正如这个 但是提供的答案是OP整体方法的替代方案 而不是如何处理具体问题 我在下面简化了一个例
  • 每隔几秒调用获取当前坐标而不使用 NSTimer

    我知道如何用 NSTimer 做到这一点 但我不想每隔几秒就在没有计时器的情况下获取当前的 iPhone 坐标 我无法使用计时器 因为我在应用程序处于后台时获取坐标 我尝试过一些方法 但每秒都会调用一次 而不是每 10 秒调用一次 因为我不
  • CodeIgniter 删除 index.php 不起作用

    我正在使用 Ubuntu 13 并为本地 codeigniter 站点进行以下设置 Apache 2 4 6 Ubuntu 5 5 3 1ubuntu2 2 CI VERSION 2 1 2 如果没有 URL 将不再有效index php
  • 已超出传入消息的最大消息大小配额 (65536)

    我在为几个表创建范围时遇到此异常 所有这些表在设计上都很大
  • 我可以使用参数化查询从 SQL Server VarBinary 列返回字节数组吗?

    我编写了一个小型 VBA 过程来测试使用 ADO 将文件作为二进制数据上传到 SQL Server 中的 VarBinary 列以及从中下载文件 上传过程似乎可以正常工作 但我无法让下载过程正常工作 我相信 VarBinary 的输出参数设
  • ASP.NET MVC RequireHttps 仅在生产环境中

    我想使用需要Https属性以防止将不安全的 HTTP 请求发送到操作方法 C RequireHttps apply to all actions in controller public class SomeController Requi
  • 将表格从 Excel 导出到 Outlook(黑莓友好)

    因此 我从互联网上的不同地方收集了一些代码 将表格导出到 Outlook 并自动发送出去 并且刚刚注意到该电子邮件并不是真正的黑莓友好 主要是因为电子邮件正文以 HTML 形式发送 而不是作为 富文本 请记住表格也需要采用富格式 我缺少一行
  • 从 Excel 导入 - 非数字值将被忽略

    我有从指定格式的 Excel 工作表导入的代码 在其中一列中 大多数数据都是数字 但也存在非数字值 由于某种原因 导入代码会忽略非数字值 连接字符串如下所示 Dim FileConnectionString As String Provid
  • 启动 celery Worker 并启用它的广播队列

    我正在尝试启动芹菜工作人员 因此它只侦听单个队列 这不是问题 我可以这样做 python m celery worker A my module Q my queue c 1 但现在我也想要这个my queue队列成为广播队列 所以我在我的
  • 以编程方式将 [AllowAnonymous] 属性添加到我的所有控制器方法

    我有一个带有多个控制器的 WebAPI2 REST api 我使用基于角色的身份验证 我在所有控制器和一些方法上添加了 Authorize 属性 但是 在 DEV 环境中我想禁用身份验证 我希望我可以将一些代码放入WebApiConfig例