2015-11-06 31 views
1

我在我的應用程序中使用Owin OpenIdConnectAuthentication模塊,並試圖將我的會話狀態移至Redis。我正在使用Microsoft.Web.Redis.RedisSessionStateProvider。當我更新我的web.config中添加RedisSessionStateProvider我開始收到此錯誤:使用RedisSessionStateProvider時Microsoft.Owin.Security.AuthenticationTicket SerializationException

Type 'Microsoft.Owin.Security.AuthenticationTicket' in Assembly 'Microsoft.Owin.Security, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' is not marked as serializable.

堆棧跟蹤

[SerializationException: Type 'Microsoft.Owin.Security.AuthenticationTicket' in Assembly 'Microsoft.Owin.Security, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' is not marked as serializable.] 
    System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type) +10951483 
    System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context) +230 
    System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() +121 
    System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder) +182 
    System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder) +51 
    System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck) +540 
    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck) +131 
    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph) +12 
    Microsoft.Web.Redis.RedisUtility.GetBytesFromObject(Object data) in c:\TeamCity\buildAgent\work\f55792526e6d9089\src\Shared\RedisUtility.cs:65 
    Microsoft.Web.Redis.RedisUtility.AppendUpdatedOrNewItemsInList(ChangeTrackingSessionStateItemCollection sessionItems, List`1 list) in c:\TeamCity\buildAgent\work\f55792526e6d9089\src\Shared\RedisUtility.cs:37 
    Microsoft.Web.Redis.RedisConnectionWrapper.TryUpdateIfLockIdMatchPrepare(Object lockId, ISessionStateItemCollection data, Int32 sessionTimeout, String[]& keyArgs, Object[]& valueArgs) in c:\TeamCity\buildAgent\work\f55792526e6d9089\src\RedisSessionStateProvider\RedisConnectionWrapper.cs:323 
    Microsoft.Web.Redis.RedisConnectionWrapper.TryUpdateAndReleaseLockIfLockIdMatch(Object lockId, ISessionStateItemCollection data, Int32 sessionTimeout) in c:\TeamCity\buildAgent\work\f55792526e6d9089\src\RedisSessionStateProvider\RedisConnectionWrapper.cs:350 
    Microsoft.Web.Redis.RedisSessionStateProvider.SetAndReleaseItemExclusive(HttpContext context, String id, SessionStateStoreData item, Object lockId, Boolean newItem) in c:\TeamCity\buildAgent\work\f55792526e6d9089\src\RedisSessionStateProvider\RedisSessionStateProvider.cs:408 
    System.Web.SessionState.SessionStateModule.OnReleaseState(Object source, EventArgs eventArgs) +565 
    System.Web.SessionState.SessionStateModule.OnEndRequest(Object source, EventArgs eventArgs) +139 
    System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +136 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +69 

我丟失了一些配置的地方?我可以找到關於序列化對象的所有文檔是用於OAuth 服務器實現。

回答

2

我們使用的是Katana的AspNetAuthSessionStore sample。顯然這個示例僅適用於InProc會話狀態。在`RetrieveAsync`是身份驗證後空權

public Task<string> StoreAsync(AuthenticationTicket ticket) 
    { 
     string key = Guid.NewGuid().ToString(); 
     HttpContext httpContext = HttpContext.Current; 
     CheckSessionAvailable(httpContext); 
     //httpContext.Session[key + ".Ticket"] = ticket;  // Remove 
     var ticketSerializer = new TicketSerializer();   // Add 
     var ticketBytes = ticketSerializer.Serialize(ticket); // Add 
     httpContext.Session[key + ".Ticket"] = ticketBytes; // Add 

     return Task.FromResult(key); 
    } 
+0

在我的情況'httpContext.Session':我們做了以下修改通過手動序列化AuthenticationTicket來解決這個問題。我嘗試在'app.UseCookieAuthentication()'之前的'startup.cs'中添加'app.UseAspNetAuthSession();',但這沒有幫助。有什麼建議麼? –

相關問題