Mono 3.4.1中的UserCookieAuthentication

当我将下面的行添加到我的Startup类时,我得到以下异常.这是一个从mono(Ubuntu)运行的自托管exe.它在 windows中工作正常.我已经缩小了UseCookieAuthentication调用的范围.我可以毫无问题地实例化选项.知道这里发生了什么吗?我有aspnet Identity工作和EF6 / MySql.
app.UseCookieAuthentication(new CookieAuthenticationoptions());

未处理的异常:
System.Reflection.TargetInvocationException:调用目标抛出了异常. —> System.TypeLoadException:无法从程序集“Microsoft.Owin.Security,Version = 2.1.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35”加载类型“Microsoft.Owin.Security.DataProtection.DpapiDataProtector”.
在Microsoft.Owin.Security.DataProtection.AppBuilderExtensions.CreateDataProtector(Owin.IAppBuilder,string [])< 0x00052>
在Microsoft.Owin.Security.Cookies.CookieAuthenticationMiddleware..ctor(Microsoft.Owin.OwinMiddleware,Owin.IAppBuilder,Microsoft.Owin.Security.Cookies.CookieAuthenticationoptions)< 0x00223>
at(wrapper dynamic-method)object.lambda_method(System.Runtime.CompilerServices.Closure,Microsoft.Owin.OwinMiddleware,Microsoft.Owin.Security.Cookies.CookieAuthenticationoptions)< 0x00048>
at(wrapper managed-to-native)System.Reflection.MonoMethod.InternalInvoke(System.Reflection.MonoMethod,object,object [],System.Exception&)< 0x00067>
在System.Reflection.MonoMethod.Invoke(object,System.Reflection.BindingFlags,System.Reflection.Binder,System.Globalization.CultureInfo)< 0x000d7>

—内部异常堆栈跟踪结束—
在System.Reflection.MonoMethod.Invoke(System.Object obj,BindingFlags invokeAttr,System.Reflection.Binder binder,System.Object [] parameters,System.Globalization.CultureInfo culture)[0x00000] in:0
在System.Reflection.MethodBase.Invoke(System.Object obj,System.Object [] parameters)[0x00000] in:0
在System.Delegate.DynamicInvokeImpl(System.Object [] args)[0x00000] in:0
在System.MulticastDelegate.DynamicInvokeImpl(System.Object [] args)[0x00000] in:0
在System.Delegate.DynamicInvoke(System.Object [] args)[0x00000] in:0
在Microsoft.Owin.Builder.AppBuilder.BuildInternal(System.Type signature)[0x00000] in:0
在Microsoft.Owin.Builder.AppBuilder.Build(System.Type returnType)[0x00000] in:0
在Microsoft.Owin.Hosting.ServerFactory.ServerFactoryAdapter.Create(IAppBuilder builder)[0x00000] in:0
在Microsoft.Owin.Hosting.Engine.HostingEngine.StartServer(Microsoft.Owin.Hosting.Engine.StartContext context)[0x00000] in:0
在Microsoft.Owin.Hosting.Engine.HostingEngine.Start(Microsoft.Owin.Hosting.Engine.StartContext context)[0x00000] in:0
在Microsoft.Owin.Hosting.Starter.DirectHostingStarter.Start(Microsoft.Owin.Hosting.StartOptions options)[0x00000] in:0
在Microsoft.Owin.Hosting.Starter.HostingStarter.Start(Microsoft.Owin.Hosting.StartOptions options)[0x00000] in:0
在Microsoft.Owin.Hosting.WebApp.StartImplementation(IServiceProvider services,Microsoft.Owin.Hosting.StartOptions options)[0x00000] in:0
在Microsoft.Owin.Hosting.WebApp.Start(Microsoft.Owin.Hosting.StartOptions选项)[0x00000] in:0
在Microsoft.Owin.Hosting.WebApp.Start [Startup](Microsoft.Owin.Hosting.StartOptions options)[0x00000] in:0
在Microsoft.Owin.Hosting.WebApp.Start [Startup](System.String url)[0x00000] in:0
在HelloWorldNancy.Program.Main(System.String [] args)[0x00000] in:0
[ERROR]致命的UNHANDLED EXCEPTION:System.Reflection.TargetInvocationException:调用目标抛出了异常. —> System.TypeLoadException:无法从程序集“Microsoft.Owin.Security,Microsoft.Owin.Hosting.StartOptions options)[0x00000] in:0
在Microsoft.Owin.Hosting.WebApp.Start(Microsoft.Owin.Hosting.StartOptions选项)[0x00000] in:0
在Microsoft.Owin.Hosting.WebApp.Start [Startup](Microsoft.Owin.Hosting.StartOptions options)[0x00000] in:0
在Microsoft.Owin.Hosting.WebApp.Start [Startup](System.String url)[0x00000] in:0
在HelloWorldNancy.Program.Main(System.String [] args)[0x00000] in:0

解决方法

好的,这是因为OWIN认使用DpapiDataProtector而DPAPI是一个Windows API(数据保护API)并且不能在单声道中工作.幸运的是,您可以覆盖cookie选项中的认值.下面是一个例子,其中AesDataProtectorProvider是我在这里找到的自定义IDataProtector: Using Oauth tickets across several services?
app.UseCookieAuthentication(new CookieAuthenticationoptions
        {
            TicketDataFormat =
                new SecureDataFormat<AuthenticationTicket>(DataSerializers.Ticket,new AesDataProtectorProvider("testing"),TextEncodings.Base64)
        });

使用此代码,我的项目再次在Mono中启动.

更新:

你也可以有一个自定义的IDataProtectionProvider,并且所有的owin都使用它:

app.SetDataProtectionProvider(new CustomIDataProtectionProvider());

相关文章

这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识...
Some samples are below for ASP.Net web form controls:(fr...
问题描述: 对于未定义为 System.String 的列,唯一有效的值...
最近用到了CalendarExtender,结果不知道为什么发生了错位,...
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence cha...