web-dev-qa-db-fra.com

Comment utiliser le middleware Owin basé sur IAppBuilder dans ASP.NET 5

ASP.NET 5 (aspnet vnext) est basé sur OWIN comme Katana, mais a des abstractions différentes. Notamment IAppBuilder a été remplacé par IApplicationBuilder. De nombreuses bibliothèques de middleware dépendent de IAppBuilder et n'ont pas été mises à jour pour prendre en charge ASP.NET 5

Comment puis-je utiliser ce middleware OWIN dans le middleware APS.NET 5. Les deux sont basés sur OWIN, cela devrait donc être possible.

Microsoft.AspNet.Builder.OwinExtensions fournit une méthode UseOwin, mais elle est basée sur les signatures OWIN de bas niveau et ne peut donc pas être utilisée avec des méthodes qui attendent IAppBuilder.

17
vossad01

Edit: vous pouvez maintenant utiliser le AspNet.Hosting.Katana.Extensions package pour cela.


Voici une version légèrement différente, qui utilise AppBuilder.DefaultApp:

public static IApplicationBuilder UseOwinAppBuilder(this IApplicationBuilder app, Action<IAppBuilder> configuration)
{
    if (app == null)
    {
        throw new ArgumentNullException(nameof(app));
    }

    if (configuration == null)
    {
        throw new ArgumentNullException(nameof(configuration));
    }

    return app.UseOwin(setup => setup(next =>
    {
        var builder = new AppBuilder();
        var lifetime = (IApplicationLifetime) app.ApplicationServices.GetService(typeof(IApplicationLifetime));

        var properties = new AppProperties(builder.Properties);
        properties.AppName = app.ApplicationServices.GetApplicationUniqueIdentifier();
        properties.OnAppDisposing = lifetime.ApplicationStopping;
        properties.DefaultApp = next;

        configuration(builder);

        return builder.Build<Func<IDictionary<string, object>, Task>>();
    }));
}

Notez que référencer Microsoft.Owin rend votre application incompatible avec dnxcore50 (Core CLR).

10
Pinpoint

La référence souvent citée que les frameworks sont compatibles est ne méthode d'extension construite par Thinktecture pour prendre en charge leur IdentityServer3 sur ASP.NET 5 .

Cette méthode est spécifique à IdentityServer et ne prend pas en charge la demande en cours de traitement par un middleware enregistré ultérieurement dans le pipeline AspNet (elle n'appelle pas le composant suivant).

Cela adapte la méthode pour combler ces lacunes:

internal static class IApplicationBuilderExtensions
{
  public static void UseOwin(
    this IApplicationBuilder app,
    Action<IAppBuilder> owinConfiguration )
  {
    app.UseOwin(
      addToPipeline =>
        {
          addToPipeline(
            next =>
              {
                var builder = new AppBuilder();

                owinConfiguration( builder );

                builder.Run( ctx => next( ctx.Environment ) );

                Func<IDictionary<string, object>, Task> appFunc =
                  (Func<IDictionary<string, object>, Task>)
                  builder.Build( typeof( Func<IDictionary<string, object>, Task> ) );

                return appFunc;
              } );
        } );
  }
}

Il peut être utilisé comme suit:

app.UseOwin(
    owin =>
        {
            // Arbitrary IAppBuilder registrations can be placed in this block

            // For example, this extension can be provided by
            // NWebsec.Owin or Thinktecture.IdentityServer3
            owin.UseHsts();
        } );

// ASP.NET 5 components, like MVC 6, will still process the request
// (assuming the request was not handled by earlier middleware)
app.UseMvc();
3
vossad01