Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有可选身份验证/授权的ASP.NET核心_C#_Asp.net Core - Fatal编程技术网

C# 具有可选身份验证/授权的ASP.NET核心

C# 具有可选身份验证/授权的ASP.NET核心,c#,asp.net-core,C#,Asp.net Core,我想构建一个基于ASP.NET核心的WebApi,用于访问数据库中的数据。此WebApi可以以两种方式使用,一种是作为需要身份验证的公共WebApi,另一种是作为web应用程序的专用后端服务。在后一种情况下,不需要进行身份验证,因为只有经过身份验证的用户才能访问web应用程序,并且web应用程序和WebApi都将在同一台计算机上运行,WebApi将对外隐藏 由于第一个场景需要身份验证,因此我将使用Authorize属性标记所有公共API。但是对于私有场景,我想绕过任何身份验证 是否有任何方法可以

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

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

是否有任何方法可以根据配置中的某个标志使身份验证成为可选的

更新


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

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

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

如果在mvc应用程序中使用openidconnect身份验证,则可以设置
SaveTokens=true
。它使您能够在cookie中存储访问令牌。当您在mvc操作中调用api时,您可以将此
access\u令牌
发送到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>();
      }
   }
public void配置服务(IServiceCollection服务)
{
如果(配置[“服务器模式”]=“内部”)
{
services.addScope();
}
}

请投票人评论一下我问这个问题的错误之处,或者我问这个问题的方式。问题是我计划使用IdentityServer作为外部令牌提供商。对于我的WebApi的内部实例,这意味着在每个请求上都有到IdentityServer的往返,尽管受信任的web应用程序是唯一可以连接到此WebApi实例的客户端。我不想在运行时区分每个请求的内部或公共请求!我认为通过配置可以绕过私有实例的身份验证。例如,从appsettings.json读取一个值,告诉我是否应该使用身份验证。我可能无法按配置打开/关闭Authorize属性。也许我可以根据我的配置避免在启动时添加授权中间件。实现我自己的中间件肯定会解决这个问题,但是,正如您所说,对我来说可能太难实现了。假设您绕过内部请求的身份验证(可能是ip控制或签名请求)。在这种情况下,您不需要让当前用户参与api操作吗?不,对于我的WebApi的私有实例,只有一个客户端,这就是我的web应用程序,它是受信任的,因此它可以访问所有内容,在WebApi中,没有我必须识别的用户设置,这只是关于访问控制。实际上,web应用程序处理身份验证/授权。另请参见问题中的“我的更新…”最后我正确地理解了您:)我更新了我的答案,它可能对您有用。@GlacialFlames在默认筛选器提供程序之前工作。