我尝试编写自定义Owin身份验证中间件。我目前只写一个比this更简单的假人。
根据this和其他教程,似乎我可以在我的DummyAuthenticationHandler的 AuthenticateCoreAsync 中返回null以指示身份验证失败。所以我做了
protected override Task<AuthenticationTicket> AuthenticateCoreAsync()
{
return null;
}
如果我返回一个带有一些虚拟ClaimsIdentity的新AuthenticationTicket,那就没关系,但是当我返回null时,当我调用任何控制器时我得到了这个异常。
[NullReferenceException: Object reference not set to an instance of an object.]
Microsoft.Owin.Security.Infrastructure.<BaseInitializeAsync>d__0.MoveNext() +450
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52
Microsoft.Owin.Security.Infrastructure.<Invoke>d__0.MoveNext() +264
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52
Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.<RunApp>d__5.MoveNext() +191
....
我一直在使用Ninject的Web Api 2,但似乎我尝试在Startup中评论出Niject的东西它仍然无法正常工作。我所有的依赖都是最新的。这是我的创业公司。
{
HttpConfiguration configuration = new HttpConfiguration();
application.UseDummyAuthentication();
configuration.SuppressDefaultHostAuthentication();
configuration.Filters.Add(new HostAuthenticationFilter("dummy"));
WebApiConfig.Register(configuration);
application.UseNinjectMiddleware(() =>
{
return NinjectWebCommon.CreateKernel(WebApiConfig.CreateConfigurationDelegate());
});
application.UseNinjectWebApi(configuration);
}
我一直在摸不着头脑,真的很想得到一些帮助。
答案 0 :(得分:3)
@Morio:您也可以在不使用异步的情况下返回Task.FromResult<AuthenticationTicket>(null)
而不是null
。
答案 1 :(得分:2)
@badri是对的。
但我想提供更多解释。
原因是,与教程中的那些不同,我的AuthenticateCoreAsync没有async修饰符。使用async返回null将导致某种空任务,当然,这与我最初返回的简单null不同。
答案 2 :(得分:1)
你不能返回null但是做这样的事情。
return new AuthenticationTicket(null, (AuthenticationProperties)null);
看到这一点。