Sud*_*nan 13 asp.net-mvc ssl nonce asp.net-mvc-filters openid-connect
我有一个ASP.NET MVC 5应用程序,可以对Azure Active Directory进行身份验证.我希望在整个应用中启用SSL.因此利用全球过滤器如下:
public class FilterConfig
{
/// <summary>
/// Registers the global filters.
/// </summary>
/// <param name="filters">The filters.</param>
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new RequireHttpsAttribute());
}
}
Run Code Online (Sandbox Code Playgroud)
在此之后,我还将项目属性中的"启用SSL"设置为true.这给了我以下SSL URL - > https:// localhost:34567.我将项目更新为在"项目URL"中"服务器"下的"Web选项卡"下的IIS Express路径中.但是在运行该站点时,我遇到以下错误:
IDX10311:RequireNonce为'true'(默认值),但validationContext.Nonce为null.nonce无法验证.如果您不需要检查nonce,请将OpenIdConnectProtocolValidator.RequireNonce设置为"false".
我有认证.在网站上启用.我使用Azure Active目录.
安全代码如下:
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = clientId,
Authority = authority,
PostLogoutRedirectUri = postLogoutRedirectUri
});
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
Audience = audience,
Tenant = tenant,
});
Run Code Online (Sandbox Code Playgroud)
认证.正在从web.config中读取值,如下所示:
<add key="ida:ClientId" value="<some_guid>" />
<add key="ida:Audience" value="https://localhost:34567/" />
<add key="ida:AADInstance" value="https://login.windows.net/{0}" />
<add key="ida:Tenant" value="microsoft.onmicrosoft.com" />
<add key="ida:PostLogoutRedirectUri" value="https://localhost:34567/" />
Run Code Online (Sandbox Code Playgroud)
我按照错误消息中的指示尝试将RequireNonce设置为false,如下所示:
ProtocolValidator = new OpenIdConnectProtocolValidator
{
RequireNonce = false
}
Run Code Online (Sandbox Code Playgroud)
但这只会导致无效的请求错误.
有人可以帮我理解这里的问题是什么吗?在启用SSL之前,一切都很顺利.
小智 15
如果错误消息以OICE_20004开头或包含IDX10311,则可以忽略异常.注意:自行承担风险.
Notifications = new OpenIdConnectAuthenticationNotifications()
{
RedirectToIdentityProvider = (context) =>
{
// Ensure the URI is picked up dynamically from the request;
string appBaseUrl = context.Request.Scheme + "://" + context.Request.Host + context.Request.PathBase + context.Request.Uri.PathAndQuery;
context.ProtocolMessage.RedirectUri = context.Request.Scheme + "://" + context.Request.Host + context.Request.PathBase + context.Request.Uri.PathAndQuery;
context.ProtocolMessage.PostLogoutRedirectUri = appBaseUrl;
return Task.FromResult(0);
},
AuthenticationFailed = (context) =>
{
if (context.Exception.Message.StartsWith("OICE_20004") || context.Exception.Message.Contains("IDX10311"))
{
context.SkipToNextMiddleware();
return Task.FromResult(0);
}
return Task.FromResult(0);
},
}
Run Code Online (Sandbox Code Playgroud)
从Azure管理门户,检查相应活动目录下的应用程序是否具有相同的登录URL和回复URL.
如果它们不相同,您将收到此错误.
启用SSL时会发生这种情况,因为它只会将URL的登录URL更改为HTTPS URL,而回复URL仍然是相同的HTTP URL.
编辑:如果您想知道为什么会发生这种情况,请继续阅读,
当您尝试使用https URL访问您的应用时,它会在您的浏览器中设置一个具有唯一编号(nonce)的cookie,并点击Azure AD进行身份验证.身份验证后,浏览器必须提供对该cookie的访问权限.但由于URL和回复URL上的登录不同,浏览器无法识别您的应用程序,也无法访问该cookie,因此应用程序会抛出此错误.
即使成功登录后,也可以通过在Web应用程序上按两次后退按钮来重现此错误。您可以尝试以下两种方法吗:在下面的代码中:
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = mViewWebSite.ClientId,
Authority = mViewWebSite.Authority,
PostLogoutRedirectUri = mViewWebSite.PostLogoutRedirectUri
});
Run Code Online (Sandbox Code Playgroud)
如错误提示所示,在身份验证选项中添加协议验证器:
ProtocolValidator = new Microsoft.IdentityModel.Protocols.OpenIdConnectProtocolValidator(){
RequireNonce = false
}
Run Code Online (Sandbox Code Playgroud)
或添加通知,这样您就可以捕获此错误并将其重定向到某个错误页面。我这样做是为了使其优雅。直到片假名人们解决它。
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthenticationFailed = context =>
{
context.HandleResponse();
context.Response.Redirect("/Error.aspx?message=" + context.Exception.Message);
return Task.FromResult(0);
}
},
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12608 次 |
| 最近记录: |