具有可选身份验证/授权的 ASP.NET Core

Nic*_*asR 5 c# asp.net-core

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

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

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

更新

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

ade*_*lin 4

如果绕过身份验证,如何区分内部或公共的 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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