我想构建一个基于ASP.NET Core的WebApi,用于从数据库访问数据。此WebApi可以以两种方式使用,既可以作为需要身份验证的公共WebApi,也可以作为Web应用程序的私有后端服务。在后一种情况下,不需要身份验证,因为只有经过身份验证的用户才能访问Web应用程序,Web应用程序和WebApi都将在同一台计算机上运行,WebApi将隐藏在外部。
由于我们需要对第一个场景进行身份验证,因此我将使用Authorize属性标记所有公共API。但对于私有场景,我想绕过任何身份验证。
根据配置中的某些标志,有没有办法让认证可选?
更新
谈到两种使用场景我指的是两个完全独立的安装!每个人都有自己的配置文件。是否需要进行身份验证的决定是在单个安装中按照每个请求进行安装!我的目标是在配置中只有一个代码库和一个开关。
答案 0 :(得分:2)
如果您绕过身份验证,您如何区分api的内部或公共请求?这会导致安全漏洞。所以你不应该绕过身份验证。
如果您在mvc应用程序中使用openidconnect身份验证,则可以设置public void Visit(Base root)
{
Visit((dynamic)root);
}
private void Visit(Composite v )
{
v.Children.ForEach(el => Visit((dynamic)el));
}
private void Visit(Leaf v)
{
// do smth
}
class Base
{
}
class Composite : Base
{
public IEnumerable<Base> Children { get;}
}
class Leaf : Base
{
}
。它使您可以在cookie中存储访问令牌。当您在mvc操作中调用api时,您可以将此SaveTokens=true
发送给api。
使用两个不同的身份验证中间件的另一种方式,一个用于内部另一个用于公共访问(这很难实现)。
我会采用第一种方法。
<强>更新强>
为了实现你的目标,我想到了一个棘手的方法,但我不确定这是好方法:
创建过滤器提供商:
access_token
然后根据配置值
有条件地注册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);
}
}
答案 1 :(得分:1)
我建议对两个应用程序进行身份验证:Web应用程序和Web API。你将拥有一切安全。 用于跳过不是一个好主意的身份验证。只需为您的Web应用程序(在Web API应用程序中)创建一个用户,该用户将在从Web API获取数据时进行身份验证。