【问题标题】:Ninject owin dependencies into IIS web host for ASP.net IdentityNinject owin 依赖项到 IIS Web 主机中以获取 ASP.net Identity
【发布时间】:2014-12-10 20:25:31
【问题描述】:

我有一段时间让 Ninject 与标准的 ASP.net Identity 解决方案一起工作。我使用的堆栈是 WebApi 2.2 和 Ninject 3.2。

我使用的是 Generated NinjectWebCommon.cs 文件,稍作修改,我将 CreateKernel 方法公开,所以我可以在 OWIN 管道中注册它。

 private static readonly Bootstrapper Bootstrapper = new Bootstrapper();
    private static IKernel _kernel;

    /// <summary>
    /// Starts the application
    /// </summary>
    public static void Start()
    {

        DynamicModuleUtility.RegisterModule(typeof (OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof (NinjectHttpModule));
        Bootstrapper.Initialize(CreateKernel);
    }

    /// <summary>
    /// Stops the application.
    /// </summary>
    public static void Stop()
    {
        Bootstrapper.ShutDown();
    }

    /// <summary>
    /// Creates the kernel that will manage your application.
    /// </summary>
    /// <returns>The created kernel.</returns>
    public static IKernel CreateKernel()
    {
        if (_kernel != null) return _kernel;

        _kernel = new StandardKernel();
        try
        {
            _kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
            _kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
            RegisterServices(_kernel);
            return _kernel;
        }
        catch
        {
            _kernel.Dispose();
            throw;
        }

    }

在我为 ASP.net 身份配置 OWIN 的 Startup.Auth.cs 文件中,我尝试使用以下设置 -

 public partial class Startup
{
    static Startup()
    {
        PublicClientId = "self";
        OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/Token"),
            Provider = new ApplicationOAuthProvider(PublicClientId),
            RefreshTokenProvider = new RefreshTokenProvider(),
            AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
            AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(20),
#if DEBUG
            AllowInsecureHttp = true
#endif
        };
    }

    public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }

    public static string PublicClientId { get; private set; }

    // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
    public void ConfigureAuth(IAppBuilder app)
    {
        //allow cors
        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
        //use ninject in owin
        app.UseNinjectMiddleware(NinjectWebCommon.CreateKernel);
        app.UseWebApi(GlobalConfiguration.Configuration);


        // Enable the application to use bearer tokens to authenticate users
        var opts = new OAuthBearerAuthenticationOptions
        {
            AuthenticationType = "Bearer",
            AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,
            Provider = new QueryStringOAuthBearerProvider("access_token")
        };
        app.UseOAuthBearerAuthentication(opts);
        app.UseOAuthAuthorizationServer(OAuthOptions);
    }
}

我遇到的问题是,每当使用 app.UseNinjectMiddleware(NinjectWebCommon.CreateKernel); 时,应用程序都会抛出“序列不包含元素错误”,并带有以下堆栈跟踪-

[InvalidOperationException: Sequence contains no elements]
   System.Linq.Enumerable.Single(IEnumerable`1 source) +315
   Ninject.Web.Mvc.NinjectMvcHttpApplicationPlugin.Start() +87
   Ninject.Web.Common.Bootstrapper.<Initialize>b__0(INinjectHttpApplicationPlugin c) +29
   Ninject.Infrastructure.Language.ExtensionsForIEnumerableOfT.Map(IEnumerable`1 series, Action`1 action) +194
   Ninject.Web.Common.Bootstrapper.Initialize(Func`1 createKernelCallback) +205
   Ninject.Web.Common.OwinHost.<Execute>d__1.MoveNext() +257
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52
   System.Runtime.CompilerServices.TaskAwaiter.GetResult() +21
   Microsoft.Owin.Cors.<Invoke>d__0.MoveNext() +1205
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52
   System.Runtime.CompilerServices.TaskAwaiter.GetResult() +21
   Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.<RunApp>d__5.MoveNext() +287
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52
   System.Runtime.CompilerServices.TaskAwaiter.GetResult() +21
   Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.<DoFinalWork>d__2.MoveNext() +272
   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() +22
   Microsoft.Owin.Host.SystemWeb.Infrastructure.ErrorState.Rethrow() +33
   Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(IAsyncResult ar) +150
   Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult ar) +42
   System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +415
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

我在设置要在 OWIN 和其他 IIS 托管 Web 应用程序中使用的 ninject 内核时是否做错了什么?

【问题讨论】:

  • 您找到解决方案了吗?
  • 我没有,我从使用 Ninject 转而使用 Autofac,所以对我来说这个话题有点像 OBE。但是,我得出的解决方案是在配置类中不使用 DI。我尽可能使用原始实体查询,并根据需要添加其他依赖项。

标签: asp.net asp.net-mvc-5 ninject owin asp.net-web-api2


【解决方案1】:

和你一样,我也花了很长时间来解决这个问题。尽管尝试了所有各种 Ninject 扩展程序集以及建议如何使用它们的大量在线代码 sn-ps,但我无法使推荐的配置正常工作。如您所说,仅当 OWIN 配置为通过app.UseNinjectMiddleware() 使用 Ninject 时才会发生异常。

最后,我只是通过从ConfigureAuth() 中删除以下行来从 DI 过程中消除 OWIN:

    app.UseNinjectMiddleware(NinjectWebCommon.CreateKernel);
    app.UseWebApi(GlobalConfiguration.Configuration);

this answer 中所述,我现在使用 Ninject 将所有必需的身份组件(UserManagerRoleManager 等)注入到使用它们的控制器中。

【讨论】:

    【解决方案2】:

    我认为您不应该同时使用 Ninject.Web.WebApi.OwinHostNinject.Web.WebApi.WebHost。你只能选择一个。

    【讨论】:

      猜你喜欢
      • 2016-04-12
      • 2014-10-10
      • 2015-10-09
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多