【发布时间】:2020-02-12 13:41:49
【问题描述】:
我们有一个模块化应用程序,这意味着我们的 api 控制器会在启动期间加载。我们将控制器加载到 applicationPart 中,如下所示:
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_3_0)
.ConfigureApplicationPartManager(applicationPartManager =>
{
foreach (var module in _modules)
{
var apiControllerAssemblies = module.GetApiControllerAssemblies();
foreach (var apiControllerAssembly in apiControllerAssemblies)
applicationPartManager.ApplicationParts.Add(new AssemblyPart(apiControllerAssembly));
}
});
我们希望通过基本身份验证来保护我们的 API。我创建了一个这样的中间件:
public class BasicAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
public BasicAuthenticationHandler(IOptionsMonitor<AuthenticationSchemeOptions> options,
ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
{
}
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
if (!Request.Headers.ContainsKey("Authorization"))
return AuthenticateResult.Fail("Missing Authorization
Header");
//More to come
}
}
中间件在startup.cs中注册如下:
services.AddAuthentication("Basic")
.AddScheme<AuthenticationSchemeOptions, BasicAuthenticationHandler>("Basic", null);
访问本地主机:总是会触发HandleAuthenticateAsync 方法。但是,当我尝试访问 localhost:/user/users 端点时,该方法永远不会遇到断点,并且总是会导致 HTTP 401 Unauthorized。控制器本身标有Authorize 属性。
有什么想法会出错吗?关于我应该从哪里开始寻找解决方案的任何提示?
谢谢!
【问题讨论】:
-
嘿 Tobias - 你解决了你的问题吗,你找到了更好的方法来在 .Net Core 中实现身份验证。我正在开始一个新项目,想知道您是否找到了更好的方法。
-
HI @Rakesh 最终创建了一个带有实现
IAuthorizationFilter的过滤器的属性 -
谢谢@Tobias,我也会试试的。