ASP.具有可选的身份验证/授权
本文关键字:身份验证 授权 ASP | 更新日期: 2023-09-27 18:13:47
我想建立一个ASP。基于。NET Core的WebApi,用于从数据库访问数据。这个WebApi可以以两种方式使用,要么作为需要身份验证的公共WebApi,要么作为web应用程序的私有后端服务。在后一种情况下,不需要身份验证,因为只有经过身份验证的用户才能访问web应用程序,并且web应用程序和WebApi将在同一台计算机上运行,WebApi将被隐藏在外部。
由于我们需要对第一个场景进行身份验证,因此我将使用Authorize属性标记所有公共api。但是对于私有场景,我想绕过任何身份验证。
是否有任何方法可以使身份验证可选取决于配置中的一些标志?
说到两个使用场景,我指的是两个完全独立的安装!每一个都有自己的配置文件。是否需要身份验证取决于每次安装,而不是一次安装中的每次请求!我的目标是在配置中只有一个代码库和一个开关。
如果绕过身份验证,如何区分api的内部或公共请求?这会导致安全漏洞。所以你不应该绕过认证。
如果你在mvc应用程序中使用openidconnect身份验证,那么你可以设置SaveTokens=true
。它允许您在cookie中存储访问令牌。当你在mvc action中调用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>();
}
}
我建议验证两个应用程序:web应用程序和web API应用程序。你会确保一切安全。跳过不是个好主意的身份验证。只需为您的web应用程序创建一个用户(在web API应用程序中),该用户将用于从web API获取数据时的身份验证。