WebApp-WebAPI-OpenIDConnect-DotNet不在azure上部署

时间:2015-04-18 09:49:51

标签: asp.net-mvc azure openid

我已经创建了WebApp-WebAPI-OpenIDConnect-DotNet的示例项目。参考项目可在git上找到。

我按照git repo上的描述执行了所有步骤。我的示例项目在本地主机上正常运行。但是,当我在Azure上部署我的项目时,它会发出以下错误。

请检查下面的堆栈跟踪。

堆栈追踪:

[NullReferenceException: Object reference not set to an instance of an object.]
   CMS.Web.Utils.NaiveSessionCache.Load() in c:\a\src\CMS.Web\CMS.Web\Utils\NaiveSessionCache.cs:30
   CMS.Web.Utils.NaiveSessionCache..ctor(String userId) in c:\a\src\CMS.Web\CMS.Web\Utils\NaiveSessionCache.cs:23
   CMS.Web.Startup.<ConfigureAuth>b__2(AuthorizationCodeReceivedNotification context) in c:\a\src\CMS.Web\CMS.Web\App_Start\Startup.Auth.cs:83
   Microsoft.Owin.Security.OpenIdConnect.<AuthenticateCoreAsync>d__1a.MoveNext() +4995
   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() +22
   Microsoft.Owin.Security.OpenIdConnect.<AuthenticateCoreAsync>d__1a.MoveNext() +6529
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52
   Microsoft.Owin.Security.Infrastructure.<BaseInitializeAsync>d__0.MoveNext() +595
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52
   Microsoft.Owin.Security.Infrastructure.<Invoke>d__0.MoveNext() +264
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52
   Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.<RunApp>d__5.MoveNext() +191
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52
   Microsoft.Owin.Security.Infrastructure.<Invoke>d__0.MoveNext() +665
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52
   Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.<RunApp>d__5.MoveNext() +191
   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +93
   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52
   Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.<DoFinalWork>d__2.MoveNext() +189
   Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(IAsyncResult ar) +69
   Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult ar) +64
   System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +415
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

2 个答案:

答案 0 :(得分:1)

我的情况相同。我的项目正在研究开发环境,并在将其发布到生产环境后将NullRefenceException放在同一行上。在完成它之后,我发现Request.Current正常,但Request.Current.Session为null。所以,我改变了我的代码:

public void Load()
    {
        lock (FileLock)
        {
            if (HttpContext.Current != null && HttpContext.Current.Session != null)
            {

                if (HttpContext.Current.Session[CacheId] == null)
                    throw new System.NullReferenceException("CacheId is null");

                Deserialize((byte[]) HttpContext.Current.Session[CacheId]);
            }
        }
    }

之后它给了我WebExcetpion 400(BAD REQUEST),这是在会话创建之前发生的。

要处理这种错误,我更改了Startup.Auth.cs:

                Notifications = new OpenIdConnectAuthenticationNotifications()
                {
                    AuthenticationFailed = OnAuthenticationFailed,
                    ...
                }

然后:

   private Task OnAuthenticationFailed(AuthenticationFailedNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> notification)
    {
        UtilLogger.PublishException(notification.Exception);

        notification.HandleResponse();
        notification.Response.Redirect($"{postLogoutRedirectUri}?message={notification.Exception.Message}");
        return Task.FromResult(0);
    }

答案 1 :(得分:0)

我看到一个类似的问题,HttpContext.Current最初在获取令牌时为null,当它尝试将该令牌保存到缓存时,您会在Load / Persist方法中看到此错误。不确定这是否是预期的,但在Load和Persist方法中对HttpContext.Current添加非空检查将减轻对象空引用异常。