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

5
我希望构建一个基于ASP.NET Core的WebApi来访问数据库中的数据。这个WebApi可以有两种使用方式,一种是公共WebApi,需要身份验证;另一种是用于Web应用程序的私有后端服务。在后一种情况下,由于只有经过身份验证的用户才能访问Web应用程序,并且Web应用程序和WebApi将在同一台计算机上运行,因此不需要进行身份验证,WebApi将对外隐藏。
由于我们需要第一种情况的身份验证,我会给所有公共API打上Authorize属性标签。但对于私有场景,我想绕过任何身份验证。
是否有办法根据配置中的某个标志使身份验证变为可选?
更新:
说到两种使用场景,我指的是两个完全独立的安装!每个都有自己的配置文件。是否需要身份验证的决定是针对每个安装而不是针对单个安装中的每个请求!我的目标是拥有一个代码库和一个配置开关。

能否请给我点踩的人评论一下,关于我提问的方式或者问题本身有哪些不妥之处? - NicolasR
2个回答

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

根据配置值有条件地进行注册

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

1
我不想在每个请求的运行时区分内部或公共请求!我认为可以通过配置来绕过我的私有实例的身份验证。例如,从appsettings.json中读取一个值,告诉我是否应该使用身份验证。我可能无法通过配置开启/关闭Authorize属性。也许我可以根据我的配置避免在启动时添加授权中间件。实现自己的中间件肯定可以解决问题,但如你所说,这对我来说可能太难了。 - NicolasR
不,对于我的WebApi的私有实例,只会有一个客户端,那就是我信任的Web应用程序,因此它可以访问所有内容,在WebApi中没有用户设置需要我识别,这只涉及访问控制。实际上,Web应用程序处理身份验证/授权。请参见我在问题中的更新... - NicolasR
最后我理解你的意思了 :) 我更新了我的答案,希望对你有用。 - adem caglin
1
@GlacialFlames 在默认过滤器提供程序之前工作。 - adem caglin
@ademcaglin 当我实现你建议的代码时,我在filterProviderContext中没有任何带有过滤器的控制器/操作。 - kanika
显示剩余4条评论

1
我建议对两个应用程序进行身份验证:Web 应用程序和 Web API。这样可以确保所有内容都是安全的。 跳过身份验证并不是一个好主意。在 Web API 应用程序中为您的 Web 应用程序创建一个用户,以便在从 Web API 获取数据时进行身份验证。

问题在于我计划使用IdentityServer作为外部令牌提供程序。对于我的WebApi的内部实例来说,这意味着每个请求都需要与IdentityServer进行往返,尽管受信任的Web应用程序是唯一可以连接到此WebApi实例的客户端。 - NicolasR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接