C# 无法验证OWIN OpenIdConnect中间件IDX10311 nonce
我有一个使用OWIN中间件的OpenIdConnect应用程序。startup.cs文件使用app.UseOpenIdConnectAuthentication的标准实现。cookie已设置为浏览器,但出现以下错误: IDX10311:Requiremonce为“true”(默认值),但validationContext.Nonce为null。无法验证nonce。如果不需要检查nonce,请将OpenIdConnectProtocolValidator.RequireNonce设置为“false” 我发现,当运行fiddler时,就像我对大多数调试项目所做的那样,这种行为会发生。返回错误,但如果我返回站点,一切正常,并且我的用户已通过身份验证。有人在运行fiddler时见过这种行为吗 与小提琴手:C# 无法验证OWIN OpenIdConnect中间件IDX10311 nonce,c#,owin,fiddler,identityserver3,openid-connect,C#,Owin,Fiddler,Identityserver3,Openid Connect,我有一个使用OWIN中间件的OpenIdConnect应用程序。startup.cs文件使用app.UseOpenIdConnectAuthentication的标准实现。cookie已设置为浏览器,但出现以下错误: IDX10311:Requiremonce为“true”(默认值),但validationContext.Nonce为null。无法验证nonce。如果不需要检查nonce,请将OpenIdConnectProtocolValidator.RequireNonce设置为“false
- OpenIdConnect中的SecurityTokenValidated通知执行两次
- 第二次通过后,抛出IDX10311错误
- 浏览器包含有效的cookie,返回到我可以查看有效用户身份数据的页面
- SecurityTokenValidated在OpenIdConnect中执行一次
- 未引发错误,继续加载验证后重定向Uri的控制器操作
- Cookie也有效,并且用户身份数据正确
想法?我不用运行fiddler就可以绕过它,但在调试时,最好也运行fiddler来检查流量。也许这就是原因 你好,我想我找到了这个问题的根本原因 我在总结我的发现:
中。这会导致“ID客户端”被视为“第三方客户端”,因为用户没有在主窗口中直接导航到该URL。因为这是第三方,对于某些浏览器来说,它的cookie必须被阻止。
实际上,通过设置“阻止第三方cookie”,可以在Chrome上获得相同的效果
因此,我必须得出结论:
a) 若iframe是必须的(在我的例子中,因为“ID客户端”是必须在我们的主平台应用程序的图形内容中运行的应用程序),我认为唯一的解决方案是拦截错误,并用页面处理它,要求用户启用第三方cookie
b) 如果iframe不是必须的,那么在新窗口中打开“ID客户机”就足够了
希望这能帮上忙,因为我疯了
Marco我知道这是一篇老文章,但我遇到了这个问题,什么都不管用,在我失去了让我的企业应用程序工作的解决方案的想法后,我最终通过在azure中将多租户选项设置为“是”来修复它(在azure中选择:应用程序注册>设置>属性,将多租户设置为“是”,然后单击“保存”)
希望它能帮助别人,看不到有人提到它。我也有同样的问题,但将Microsoft.Owin.Security.OpenIdConnect切换回3.0.1版解决了这个问题我在后台运行IIS Express时注意到了这个错误,当时我已切换到以完全IIS托管。当我禁用IIS Express时,我的错误消失了。对于我来说,在Azure active directory中更改回复url是可行的 启用SSL时会发生这种情况,因为它仅将登录URL更改为HTTPS URL,而回复URL保持相同的HTTP URL
当您尝试使用https URL访问应用程序时,它会在浏览器中设置一个具有唯一编号(nonce)的cookie,并点击Azure AD进行身份验证。身份验证后,浏览器必须授予对该cookie的访问权限。但由于登录URL和回复URL不同,浏览器无法识别您的应用程序,也无法访问该cookie,因此应用程序会抛出此错误。web.config中的cookies重写规则可确保samesite cookies出现此神秘异常。禁用该规则解决了这个问题。通过Azure Active Directory保护的应用程序的一个临时解决方案是注销(通过转到站点/帐户/注销页面),然后我可以返回主页并正常登录。希望这对某人有帮助。我知道这件事已经有一段时间了。我的具体问题是在Fiddler(traffic inspector proxy)运行时与IdentityServer身份验证相关的IDX10311错误。在主机名包含“localhost”的情况下,我添加了一个自定义owin中间件来捕获和吸收IDX13011。忽略此异常允许我们使用带有fiddler的站点作为解决方法。我认为这会导致身份验证过程中断,尽管我们必须在回调上的浏览器地址栏中按enter键才能重新启动,但这只会影响开发 下面是我们在abs中间件中使用的invoke方法
public override async Task Invoke(IOwinContext context) {
try {
await Next.Invoke(context);
} catch (Exception ex) {
_errorHandling = new ErrorHandling();
if (ex.Message.Contains("IDX10803")) {
//do something here to alert your IT staff to a possible IdSvr outage
context.Response.Redirect("/Error/IdSvrDown?message=" + ex.Message);
} else if(ex.Message.Contains("IDX10311") && context.Request.Host.Value.Contains("localhost")) {
//absorb exception and allow middleware to continue
} else {
context.Response.Redirect("/Error/OwinMiddlewareError?exMsg=" + ex.Message + "&owinContextName=" + lastMiddlewareTypeName);
}
}
}
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
ClientId = ConfigurationManager.AppSettings["ClientId"].ToString(),
Authority = ConfigurationManager.AppSettings["Authority"].ToString(),
RedirectUri = ConfigurationManager.AppSettings["RedirectUri"].ToString();//https://www.example.com
}
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
ClientId = ConfigurationManager.AppSettings["ClientId"].ToString(),
Authority = ConfigurationManager.AppSettings["Authority"].ToString(),
RedirectUri = ConfigurationManager.AppSettings["RedirectUri"].ToString(),//https://www.example.com
,
// sample how to access token on form (when adding the token response type)
Notifications = new OpenIdConnectAuthenticationNotifications
{
RedirectToIdentityProvider = async n =>
{
var uri = n.Request.Uri; //From request URL determine the RedirctUri and set below
n.ProtocolMessage.RedirectUri =""//Set the url here
}
}
}