1

我正在尝试编写一个自定义的 Owin 身份验证中间件。我目前只写一个比更简单的假人。

根据这个和其他教程,似乎我可以在我的 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
....

我一直在将 Web Api 2 与 Ninject 一起使用,但似乎即使我尝试在 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);
}

我一直在挠头一天,真的很想得到一些帮助。

4

3 回答 3

3

@Morio:您也可以返回Task.FromResult<AuthenticationTicket>(null)而不是null不使用异步。

于 2014-11-12T23:01:24.887 回答
2

@badri 是正确的。

但我想给出更多解释。

原因是,与教程中的不同,我的 AuthenticateCoreAsync 没有 async 修饰符。使用异步返回 null 将导致某种空任务,当然,这与我最初返回的简单 null 不同。

于 2014-11-12T22:00:00.803 回答
1

您不能返回 null 而是执行类似的操作。

return new AuthenticationTicket(null, (AuthenticationProperties)null);

看到这个。

https://github.com/thinktecture/Thinktecture.IdentityModel/blob/master/source/Hawk/Owin/HawkAuthenticationHandler.cs

于 2014-11-12T14:23:32.950 回答