在ASP.NET MVC 5应用程序中启用SSL会导致OpenIdConnectProtocolValidator问题

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)

  • 您能否为您提供的解决方案添加更多说明? (4认同)
  • 在方案中为我工作:用户使用浏览器后退按钮导航到SSO身份验证页面. (2认同)

Nar*_*ren 8

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

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

启用S​​SL时会发生这种情况,因为它只会将URL的登录URL更改为HTTPS URL,而回复URL仍然是相同的HTTP URL.

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

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


Abs*_*Abs 6

即使成功登录后,也可以通过在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)