【问题标题】:ASP.NET Core with optional authentication/authorization具有可选身份验证/授权的 ASP.NET Core
【发布时间】:2016-10-19 22:45:32
【问题描述】:

我想构建一个基于 ASP.NET Core 的 WebApi 来访问数据库中的数据。这个 WebApi 可以以两种方式使用,或者作为需要身份验证的公共 WebApi,或者作为 Web 应用程序的私有后端服务。在后一种情况下,不需要身份验证,因为只有经过身份验证的用户才能访问 Web 应用程序,并且 Web 应用程序和 WebApi 将在同一台计算机上运行,​​WebApi 将对外部隐藏。

由于我们需要对第一个场景进行身份验证,因此我将所有公共 API 都标记为 Authorize 属性。但对于私人场景,我想绕过任何身份验证。

有什么方法可以根据配置中的某些标志使身份验证成为可选?

更新

说到两个使用场景,我的意思是两个完全独立的安装!每个都有自己的配置文件。是否需要身份验证的决定是每次安装而不是单个安装中的每个请求!我的目标是在配置中只有一个代码库和一个开关。

【问题讨论】:

  • 投反对票的人能否评论一下我在问这个问题或问这个问题的方式上做错了什么?

标签: c# asp.net-core


【解决方案1】:

如果绕过身份验证,如何区分对 api 的内部或公共请求?这会导致安全漏洞。所以你不应该绕过身份验证。

如果您在 mvc 应用程序中使用 openidconnect 身份验证,则可以设置SaveTokens=true。它使您能够将访问令牌存储在 cookie 中。当您在 mvc 操作中调用 api 时,您可以将此 access_token 发送到 api。

另一种使用两种不同身份验证中间件的方式,一种用于内部,另一种用于公共访问(这很难实现)。

我会采用第一种方法。

更新

为了实现你的目标,我想到了一个棘手的方法,但我不确定它是不是好方法:

创建过滤器提供者:

public class EncFilterProvider : IFilterProvider
{
    public int Order
    {
        get
        {
            return -1500;
        }
    }

    public void OnProvidersExecuted(FilterProviderContext context)
    {
    }

    public void OnProvidersExecuting(FilterProviderContext context)
    {
        // remove authorize filters
        var authFilters = context.Results.Where(x => 
           x.Descriptor.Filter.GetType() == typeof(AuthorizeFilter)).ToList();
        foreach(var f in authFilters)
            context.Results.Remove(f);
    }
}

然后根据配置值有条件地注册它

  public void ConfigureServices(IServiceCollection services)
  {
      if(config["servermode"] = "internal")
      {
          services.AddScoped<IFilterProvider, EncFilterProvider>();
      }
   }

【讨论】:

  • 我不想在运行时区分每个请求的内部或公共请求!我认为可以通过配置绕过我的私有实例的身份验证。例如,从 appsettings.json 中读出一个值,告诉我是否应该使用身份验证。我可能无法通过配置打开/关闭 Authorize 属性。也许我可以根据我的配置避免在启动时添加授权中间件。实现我自己的中间件当然可以解决问题,但正如你所说,对我来说实现起来可能太难了。
  • 假设您无论如何都绕过了内部请求的身份验证(可能是 ip 控制或签名请求)。在这种情况下,您不需要在 api 操作中获取当前用户吗?
  • 不,对于我的 WebApi 的私有实例,只有一个客户端,这是我的 Web 应用程序,它是受信任的,因此它可以访问所有内容,并且在 WebApi 中没有我想要的用户设置必须识别,它只是关于访问控制。实际上,Web 应用程序处理身份验证/授权。另请参阅我在问题中的更新...
  • 终于我理解正确了:) 我更新了我的答案,它可能对你有用。
  • @GlacialFlames 在默认过滤器提供程序之前工作。
【解决方案2】:

我建议对两个应用程序进行身份验证:Web 应用程序和 Web API 一个。您将获得一切安全保障。 跳过不是一个好主意的身份验证。只需为您的 Web 应用程序(在 Web API 应用程序中)创建一个用户,该用户将用于在从 Web API 获取数据时进行身份验证。

【讨论】:

  • 问题是我打算使用 IdentityServer 作为外部令牌提供者。对于我的 WebApi 的内部实例,这意味着每个请求都会往返于 IdentityServer,尽管受信任的 Web 应用程序是唯一可以连接到此 WebApi 实例的客户端。
猜你喜欢
  • 2021-04-16
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多