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

时间:2018-11-09 22:35:35

标签: asp.net-web-api authorization

我有一个带有多个控制器的WebAPI2 REST api。我使用基于角色的身份验证。我在所有控制器和某些方法上都添加了[Authorize]属性。但是,在DEV环境中,我想禁用身份验证。我希望可以将一些代码放入SELECT Name, SUM(IF(typeofcontract='Account') THEN 1 ELSE 0) NoOfAccount, SUM(IF(typeofcontract='Loan') THEN 1 ELSE 0) NoOfLoan, SUM(IF(typeofcontract='Deposit') THEN 1 ELSE 0) NoOfDeposit, SUM(IF(typeofcontract='Account') THEN amount * -1 ELSE IF (typeofcontract='Loan') THEN amount) BorrowedAmount, SUM(IF(typeofcontract='Deposit') THEN amount) AvailableAmount, SUM(IF(typeofcontract='Deposit') THEN amount ELSE IF (typeofcontract='Loan') THEN amount * -1) TotalAmount FROM Table1 GROUP BY Name 中,例如:

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());
        }
    }
}

在运行时是否可以关闭REST api中的所有身份验证?

2 个答案:

答案 0 :(得分:1)

我将分享几种方法。我的服务的工作方式是,我们有一个基础控制器类FooController,其中包含用于服务的所有逻辑。根据环境(请不要问!),我们有从FooController派生的DevFooController。

Register方法中,我们看起来很像这样:

var controller = (Environment.GetEnvironmentVariable("DEV_ENVIRONMENT") == "1") ? "DevFoo" : "Foo";

/// api/{tenant}/{id}
config.Routes.MapHttpRoute(
      name: "RouteName",
      routeTemplate: "api/{tenant}/{id}",
      defaults: new { controller = controller, action = "actionName" });

属性在相应的控制器上应用。

曲棍球?对。作品?也是。

我用来处理依赖注入的另一个系统。所有控制器始终处于注册状态。在每个请求上,注入器都有一些关于请求的内容(开发/生产,航班,地理位置等),并且能够选择正确的混凝土控制器。这些类看起来很相似,但是FooController还实现了IFooController,并且多个注册的类都可以同时使用,而上面的示例中只有一个静态配置的路由可用。

我更喜欢IoC方法,但是当我现在在白板上拟定我支持的服务时,我不在身边。

我们也以这种方式实现的一个值得注意的功能是对CORS的支持。在任何预生产端点上均不可用。

最后,我们在可能会按您希望的方式工作的几种方法上都有一个ActionFilter。 “允许匿名”逻辑位于ActionFilter本身中。如果your condition is true,过滤器将继续而不验证任何身份。我们执行自己的AuthZ,但可以按照您的描述进行配置。

希望这些建议之一对您有用。

答案 1 :(得分:1)

我不会“删除”授权。假设您有一个客户,并且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());

        // ...
    }

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