Asp.net mvc 4 使用nonce为登录页面添加书签

Asp.net mvc 4 使用nonce为登录页面添加书签,asp.net-mvc-4,identityserver4,identityserver3,katana,nonce,Asp.net Mvc 4,Identityserver4,Identityserver3,Katana,Nonce,我正在尝试使用Microsoft OWIN中间件OIDC authentication v4.0.0将MVC4 web客户端与IdentityServer集成。当从授权端点请求ID令牌时,必须提供nonce,并且提供的登录页面在查询字符串中具有nonce。如果用户将此标记为书签并在第二天使用它登录(例如),客户端中的nonce验证将失败,因为他们不再存储该nonce,或者该nonce已过期,等等 这将触发客户端中的AuthenticationFailed通知,但出现以下异常: “IDX21323

我正在尝试使用Microsoft OWIN中间件OIDC authentication v4.0.0将MVC4 web客户端与IdentityServer集成。当从授权端点请求ID令牌时,必须提供nonce,并且提供的登录页面在查询字符串中具有nonce。如果用户将此标记为书签并在第二天使用它登录(例如),客户端中的nonce验证将失败,因为他们不再存储该nonce,或者该nonce已过期,等等

这将触发客户端中的AuthenticationFailed通知,但出现以下异常:

“IDX21323:requirence是”[PII是隐藏的]“.OpenIdConnectProtocolValidationContext.Nonce为空,OpenIdConnectProtocol.ValidatedIdToken.Payload.Nonce为非空。无法验证Nonce。如果不需要检查Nonce,请将OpenIdConnectProtocolValidator.Requirement设置为“false”。注意,如果找到“Nonce”,将对其进行计算。”

此时,我可以处理响应、重定向到错误页面等等。如果他们随后再次尝试访问受保护的资源,则重定向到IdentityServer会立即返回一个ID令牌,这是由于上次成功登录(从它的角度来看,我猜是吧?),这一次,nonce将验证,用户将登录到客户端。但对于用户来说,这是一种相当奇怪的体验——他们第一次登录的尝试似乎失败了,他们得到了一个错误,但是当他们再次尝试时,他们甚至不需要登录,他们只是直接进入

另一种方法是在AuthenticationFailed中处理此类异常,方法是重定向到受家庭保护的资源,以便在后台“无缝”发生异常。对于用户来说,他们的第一次登录尝试似乎成功了。但我不确定这是否适用于真正的nonce验证问题。我还担心在某些情况下,这可能会导致重定向循环


所以要回答我的问题。。。为登录页面/非登录页面添加书签的常见方法是什么?我是不是犯了一个根本性的错误,还是在某个地方发现了一个根本性的误解,从而导致了这种情况的发生?

以下是调用

UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
   AuthenticationType = "oidc",
   Authority = appSettings["ida:Authority"],
   ClientId = appSettings["ida:ClientId"],
   ClientSecret = appSettings["ida:ClientSecret"],
   PostLogoutRedirectUri = appSettings["ida:PostLogoutRedirectUri"],
   RedirectUri = appSettings["ida:RedirectUri"],
   RequireHttpsMetadata = false,
   ResponseType = "code id_token",
   Scope = appSettings["ida:Scope"],
   Notifications = new OpenIdConnectAuthenticationNotifications
   {
       AuthenticationFailed = authFailed =>
       {
           if (authFailed.Exception.Message.Contains("IDX21323"))
           {
              authFailed.HandleResponse();
              authFailed.OwinContext.Authentication.Challenge();
           }

           return Task.FromResult(true);
                    }
         },
      SignInAsAuthenticationType = "Cookies"
    }
});

我还对解决这个问题的好方法感兴趣。我们要做的是捕获异常并触发ChallengeAsync,这样就创建了一个新的nonce,从而正确地验证它。这可能是OpenID Connect中间件的一项功能吗?谢谢,这是一种更好、更简洁的方法,可以实现我在上面的替代建议中的结果,也是我目前实现的解决方案。我仍然想让其他人知道这一点,但我最终可能会接受这个答案。再次感谢。