微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/aspnet/248816.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐