14

我有一个针对 Azure Active Directory 进行身份验证的 ASP.NET MVC 5 应用程序。我想在整个应用程序上启用 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());
    }
}

在此之后,我还将项目属性中的“启用 SSL”设置为 true。这给了我以下 SSL URL -> https://localhost:34567。我更新了项目,使其位于“项目 URL”中服务器下的“Web 选项卡”下的 IIS Express 路径中。但是在运行该站点时,我遇到了以下错误:

IDX10311:RequireNonce 为“真”(默认),但 validationContext.Nonce 为空。无法验证随机数。如果您不需要检查 nonce,请将 OpenIdConnectProtocolValidator.RequireNonce 设置为“false”。

我有身份验证。在网站上启用。我使用 Azure 活动目录。

安全码如下:

app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = clientId,
                Authority = authority,
                PostLogoutRedirectUri = postLogoutRedirectUri                    
            });

        app.UseWindowsAzureActiveDirectoryBearerAuthentication(
            new WindowsAzureActiveDirectoryBearerAuthenticationOptions
            {
                Audience = audience,
                Tenant = tenant,      
            });

授权。正在从 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/" />

我尝试按照错误消息中的指示将 RequireNonce 设置为 false,如下所示:

ProtocolValidator = new OpenIdConnectProtocolValidator
                {
                    RequireNonce = false
                }

但这只会导致无效的请求错误。

有人可以帮我理解这里的问题吗?在启用 SSL 之前,一切都很好。

4

8 回答 8

17

如果错误消息以 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);
    },
}
于 2015-04-11T09:43:09.677 回答
9

在 Azure 管理门户中,检查相应活动目录下的应用程序是否具有相同的登录 URL回复 URL

如果它们不相同,您将收到此错误。

当您启用 SSL 时会发生这种情况,因为它仅将登录 URL 更改为 HTTPS URL,而回复 URL 保持相同的 HTTP URL。

编辑:如果你想知道为什么会发生这种情况,请继续阅读,

当您尝试使用 https URL 访问您的应用程序时,它会在您的浏览器中设置一个具有唯一编号 (nonce) 的 cookie,并点击 Azure AD 进行身份验证。身份验证后,浏览器必须授予对该 cookie 的访问权限。但由于登录 URL 和回复 URL 不同,浏览器无法识别您的应用程序,也无法访问该 cookie,因此应用程序会抛出此错误。

于 2015-09-24T10:14:11.593 回答
6

即使在成功登录后,我也可以通过在我的 Web 应用程序上按几次后退按钮来重现此错误。您可以尝试以下两件事吗:在下面的代码中:

app.UseOpenIdConnectAuthentication(
                new OpenIdConnectAuthenticationOptions
                {
                    ClientId = mViewWebSite.ClientId,
                    Authority = mViewWebSite.Authority,
                    PostLogoutRedirectUri = mViewWebSite.PostLogoutRedirectUri
                });

添加协议验证器作为身份验证选项之一,如错误所示:

ProtocolValidator = new Microsoft.IdentityModel.Protocols.OpenIdConnectProtocolValidator(){
                            RequireNonce = false
                        }

或添加通知,通过它您可以捕获此错误并将其重定向到某个错误页面。我这样做是为了让它优雅。直到 Katana 人修复它。

Notifications = new OpenIdConnectAuthenticationNotifications
                        {
                            AuthenticationFailed = context =>
                            {
                                context.HandleResponse();
                                context.Response.Redirect("/Error.aspx?message=" + context.Exception.Message);
                                return Task.FromResult(0);
                            }
                        },
于 2015-08-07T07:03:58.233 回答
1

I manage to work around this problem using following method in the Global.asax file. At least this won't show the exception to the client. I use ELMAH to catch exceptions.

protected void Application_Error(object sender, EventArgs args)
    {
        var ex = Server.GetLastError();
        if (ex.Message.Contains("IDX10311:"))
        {
            Server.ClearError();
            Response.Redirect("https://www.yoursitename.com");                 
        }
于 2017-06-09T07:02:08.657 回答
1

这里的问题很简单......我花了几个小时才弄清楚这一点。由于我在本地测试没有 https 并且在最初在 Azure AD 中创建我的应用程序时告诉你真相,因为我在测试期间不希望它是 https 我将其设为纯 http(replyUrl 的主页网址,注销所有爵士乐)

然后在这样做之后,我遇到了很多人遇到的无限循环问题。所以然后我决定在我的本地模拟证书,是的,它摆脱了无限重定向,但随后又带来了另一个“IDX10311:RequireNonce is 'true'”

长话短说……让您的 AzureAD 应用程序在其所有端点中都使用 https。和沃拉!

于 2017-11-28T14:16:35.333 回答
1

@zb3b 答案+ @jonmeyer 答案

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
    ...
    Notifications = new OpenIdConnectAuthenticationNotifications()
    {
        ...
        AuthenticationFailed = (context) =>
        {
            if ((context.Exception is OpenIdConnectProtocolInvalidNonceException) &&
                (context.OwinContext.Authentication.User.Identity.IsAuthenticated))
            {
                context.SkipToNextMiddleware();
                return Task.FromResult(0);
            }

            return Task.FromResult(0);
        },
        ...
    }
});
于 2018-08-03T12:24:09.130 回答
1

好吧,最好看一下 katana 源代码,从中我发现异常类型是 OpenIdConnectProtocolInvalidNonceException 所以我像这样处理它。

        if (n.Exception is OpenIdConnectProtocolInvalidNonceException &&
            n.OwinContext.Authentication.User.Identity.IsAuthenticated)
        {
            n.SkipToNextMiddleware();
            return;
        }

我在缓存登录后单击后退按钮的页面和用户的浏览器上弹出此异常。

于 2017-11-03T16:28:14.863 回答
0

只需添加我刚刚遇到的另一个案例:您连接的网络可能正在修改 HTML 内容。

一位客户打电话给他一个问题:他无法克服这个错误。那是一台他以前没有登录过的新笔记本电脑。在尝试了几种可能的解决方案大约一小时后,我决定检查他连接的网络。

事实证明,他连接到机场的网络,开放且不安全,并且没有使用 VPN 服务(那里缺少一些SETA)。我不确切知道谁在运营该网络或他们在做什么,但 Azure AD 服务一定检测到某种类型的随机数篡改。

用户连接到可信网络的那一刻,问题就解决了。

于 2017-12-18T23:50:51.607 回答