How to use IAppBuilder-based Owin Middleware in ASP.NET 5

后端 未结 2 382
鱼传尺愫
鱼传尺愫 2021-02-05 07:31

ASP.NET 5 (aspnet vnext) is OWIN based like Katana was, but has different abstractions. Notably IAppBuilder has been replaced by IApplicationBuilder.

相关标签:
2条回答
  • 2021-02-05 07:54

    The oft cited reference that the frameworks are compatible is an extension method build by Thinktecture for supporting their IdentityServer3 on ASP.NET 5.

    That method is specific to IdentityServer and does not support the request being processed by any middleware registered later in the AspNet pipeline (it does not call the next component).

    This adapts the method to address those shortcomings:

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

    It can be used as follows:

    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();
    
    0 讨论(0)
  • 2021-02-05 07:55

    Edit: you can now use the AspNet.Hosting.Katana.Extensions package for that.


    Here's a slightly different version, that uses 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>>();
        }));
    }
    

    Note that referencing Microsoft.Owin makes your app incompatible with dnxcore50 (Core CLR).

    0 讨论(0)
提交回复
热议问题