재우니의 블로그


https://stackoverflow.com/a/23354148


위의 사이트에서 아래의 오류에 대해 이야기를 하고 있는데요. 사실 Microsoft.AspNet.Identity.ClaimsIdentityFactory 에서 오류가 발생되는 현상에 대해서는 상세히 알수가 없습니다. 아래 로그는 System.Security.Claims.Claim..ctor 에서 두번째 파라미터의 value 값이 null 로 인해 오류가 발생된 사항입니다.


FATAL 2017-08-19 18:00:45,119 3600512ms Global                 Application_Error  - System.ArgumentNullException: 값은 null일 수 없습니다.

매개 변수 이름: value

   위치: System.Security.Claims.Claim..ctor(String type, String value, String valueType, String issuer, String originalIssuer, ClaimsIdentity subject, String propertyKey, String propertyValue)

   위치: System.Security.Claims.Claim..ctor(String type, String value, String valueType)

   위치: Microsoft.AspNet.Identity.ClaimsIdentityFactory`2.<CreateAsync>d__0.MoveNext()

--- 예외가 throw된 이전 위치의 스택 추적 끝 ---

   위치: System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   위치: System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   위치: UnivDefault.Web.IdentityModels.ApplicationUser.<GenerateUserIdentityAsync>d__29.MoveNext()

--- 예외가 throw된 이전 위치의 스택 추적 끝 ---

   위치: System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   위치: System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   위치: Microsoft.AspNet.Identity.Owin.SecurityStampValidator.<>c__DisplayClass2`3.<<OnValidateIdentity>b__1>d__4.MoveNext()

--- 예외가 throw된 이전 위치의 스택 추적 끝 ---

   위치: System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   위치: System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   위치: Microsoft.Owin.Security.Cookies.CookieAuthenticationHandler.<AuthenticateCoreAsync>d__2.MoveNext()

--- 예외가 throw된 이전 위치의 스택 추적 끝 ---

   위치: System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   위치: System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   위치: Microsoft.Owin.Security.Infrastructure.AuthenticationHandler.<BaseInitializeAsync>d__0.MoveNext()

--- 예외가 throw된 이전 위치의 스택 추적 끝 ---

   위치: System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   위치: System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   위치: Microsoft.Owin.Security.Infrastructure.AuthenticationMiddleware`1.<Invoke>d__0.MoveNext()

--- 예외가 throw된 이전 위치의 스택 추적 끝 ---

   위치: System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   위치: System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   위치: Microsoft.AspNet.Identity.Owin.IdentityFactoryMiddleware`2.<Invoke>d__0.MoveNext()

--- 예외가 throw된 이전 위치의 스택 추적 끝 ---

   위치: System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   위치: System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   위치: Microsoft.AspNet.Identity.Owin.IdentityFactoryMiddleware`2.<Invoke>d__0.MoveNext()

--- 예외가 throw된 이전 위치의 스택 추적 끝 ---

   위치: System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   위치: System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   위치: Microsoft.AspNet.Identity.Owin.IdentityFactoryMiddleware`2.<Invoke>d__0.MoveNext()

--- 예외가 throw된 이전 위치의 스택 추적 끝 ---

   위치: System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   위치: System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   위치: Microsoft.AspNet.Identity.Owin.IdentityFactoryMiddleware`2.<Invoke>d__0.MoveNext()

--- 예외가 throw된 이전 위치의 스택 추적 끝 ---

   위치: System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   위치: System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   위치: Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContextStage.<RunApp>d__5.MoveNext()

--- 예외가 throw된 이전 위치의 스택 추적 끝 ---

   위치: System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   위치: System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   위치: Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.<DoFinalWork>d__2.MoveNext()

--- 예외가 throw된 이전 위치의 스택 추적 끝 ---

   위치: System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

   위치: Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(IAsyncResult ar)

   위치: System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()

   위치: System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

 (LoginID : ) (Module : Base) (ip : 10.51.2.167)



인증 시, 매번 SecurityStamp 의 guid 생성하기

위에서 null 이 들어간 이유가 SecurityStamp 로 인한 대답을 들었는데요. 사실 SecurityStamp 는 IdentityUsers 테이블에 사용자 가입 후 저장되어 있을때 Guid 형태로 난수값이 테이블에 들어가 있는데요.  그 SecurityStamp 데이터를 사용하지 않고 직접 다시 guid 를 만들어 user 객체에 담아 인증쿠키를 생성하도록 하면 된다는 것입니다. 그 부분은 아래와 같이 구현이 가능합니다.


var user = userManager.FindByNameAsync("some_username").Result; 

user.SecurityStamp = Guid.NewGuid().ToString(); 

signInManager.SignIn(user, false, false);


위와 같이 작업을 처리하고나서 패치 후 아직까진 동일한 오류가 발생되지 않았는데요. 

이전에는 위와 같이 구현하지 않고도 문제가 없이 사용했는데, 갑자기 어쩌다 한번 나는 이유인지라 난감한 사항이네요.


중복 데이터 존재확인 필요


또한 이를 관리하는 테이블에 동일한 데이터가 2건 이상 중복값이 있는지도 확인해 보세요.

그것을 하나의 고유 데이터만 남기고 제거하시면 위의 오류가 발생하지 않기도 합니다.