위의 사이트에서 아래의 오류에 대해 이야기를 하고 있는데요. 사실 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)
위에서 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건 이상 중복값이 있는지도 확인해 보세요.
그것을 하나의 고유 데이터만 남기고 제거하시면 위의 오류가 발생하지 않기도 합니다.