Исключение, когда OWIN Middleware AuthenticationHandler AuthenticateCoreAsync возвращает значение null

Я пытаюсь написать собственное ПО промежуточного слоя аутентификации Owin. В настоящее время я пишу только фиктивный вариант, даже более простой, чем этот.

Согласно этому и другим руководствам, кажется, я мог бы вернуться null в AuthenticateCoreAsync моего DummyAuthenticationHandler, чтобы указать на сбой аутентификации. Так я и сделал

protected override Task<AuthenticationTicket> AuthenticateCoreAsync()
{
    return null;
}

Это нормально, если я возвращаю новый AuthenticationTicket с каким-то фиктивным ClaimsIdentity в нем, но когда я возвращаю 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, но, похоже, даже я пытался комментировать материал Niject в Startup, но это все равно не сработает. и все мои зависимости обновлены. Это мой Стартап.

{
    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);
}

Я чешу голову в течение дня, очень хотелось бы получить некоторую помощь.


person Morio    schedule 11.11.2014    source источник


Ответы (3)


@Morio: вы также можете вернуть Task.FromResult<AuthenticationTicket>(null) вместо null без использования асинхронности.

person ezile    schedule 12.11.2014

@бадри прав.

Но я хотел бы дать больше пояснений.

Причина в том, что в отличие от руководств мой AuthenticateCoreAsync не имеет асинхронного модификатора. возврат null с помощью async приведет к какой-то пустой задаче, которая, конечно, отличается от простого null, который я первоначально вернул.

person Morio    schedule 12.11.2014

Вы не можете вернуть null, но сделайте что-то вроде этого.

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

Видеть это.

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

person Badri    schedule 12.11.2014