2016-10-19 47 views
1

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

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

有什么办法可以使认证可选取决于配置中的一些标志?

更新两个

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

+0

Coul ðdownvoter请评论我做错了什么问这个问题或我问的方式? – NicolasR

回答

3

如果你绕过认证,你如何区分内部或公共的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>(); 
     } 
    } 
+0

我不想在运行时为每个请求区分内部或公共请求!我认为可以通过配置绕过我的私有实例的身份验证。例如从appsettings中读出一个值。json告诉我是否应该使用认证。我可能无法通过配置打开/关闭Authorize属性。也许我可以避免在启动时添加授权中间件,具体取决于我的配置。实现我自己的中间件当然能够解决问题,但正如你所说,可能太难以为我实现。 – NicolasR

+0

假设您无论如何绕过内部请求的身份验证(可能是ip控制或签名请求)。在这种情况下,你不需要在api action中获取当前用户吗? –

+0

不,对于我的WebApi的私人实例,只有一个客户端,这是我的Web应用程序,它是可信的,因此它可以访问所有内容,并且在WebApi中没有我必须识别的用户设置,它只是关于访问控制。其实Web应用程序处理认证/授权。另请参阅我的问题更新... – NicolasR

0

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

+0

问题是我打算使用IdentityServer作为外部令牌提供程序。对于我的WebApi的内部实例来说,这意味着每次请求都会往返IdentityServer,尽管可信Web应用程序是唯一可以连接到此WebApi实例的客户端。 – NicolasR