web-dev-qa-db-fra.com

L'activation de SSL dans l'application ASP.NET MVC 5 entraîne un problème OpenIdConnectProtocolValidator

J'ai une application ASP.NET MVC 5 qui s'authentifie auprès d'Azure Active Directory. Je voulais activer SSL sur l'application. et donc exploité les filtres globaux comme suit:

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());
    }
}

Après cela, j'ai également défini "Activer SSL" dans les propriétés du projet sur true. Cela m'a donné l'URL SSL suivante -> https: // localhost: 34567 . J'ai mis à jour le projet pour que cela se trouve dans son chemin IIS Express sous l'onglet "Web", sous Serveurs dans "URL du projet". Cependant, lors de l'exécution du site, je rencontre l'erreur suivante:

IDX10311: RequireNonce est 'true' (par défaut) mais validationContext.Nonce est null. Un nonce ne peut pas être validé. Si vous n'avez pas besoin de vérifier le nonce, définissez OpenIdConnectProtocolValidator.RequireNonce sur 'false'.

J'ai auth. activé sur le site. J'utilise Azure Active Directory.

Le code de sécurité est le suivant:

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

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

L'auth. les valeurs sont lues à partir de web.config et sont les suivantes:

<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/" />

J'ai essayé de définir RequireNonce sur false comme indiqué dans le message d'erreur comme suit:

ProtocolValidator = new OpenIdConnectProtocolValidator
                {
                    RequireNonce = false
                }

Mais cela a juste abouti à une erreur de requête invalide.

Quelqu'un pourrait-il m'aider à comprendre quel est le problème ici? Tout a fonctionné jusqu'à ce que SSL soit activé.

11

Vous pouvez ignorer les exceptions si le message d'erreur commence par OICE_20004 ou contient IDX10311. Remarque: faites-le à vos risques et périls.

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);
    },
}
14
zb3b

Sur le portail de gestion Azure, vérifiez que votre application située dans l'annuaire Active Directory correspondant a le même URL de connexion et URL de réponse .

 

 

S'ils ne sont pas identiques, vous obtiendrez cette erreur.

Cela se produit lorsque vous activez SSL, car il modifie uniquement l'URL de connexion en URL HTTPS, tandis que l'URL de réponse reste la même URL HTTP.

Edit: Continuez votre lecture si vous voulez savoir exactement pourquoi cela se produit,

Lorsque vous essayez d'accéder à votre application à l'aide de l'URL https, un cookie avec un numéro unique (nonce) est créé dans votre navigateur et il est authentifié par Azure AD. Après l’authentification, le navigateur doit donner accès à ce cookie. Mais comme l'URL de connexion et l'URL de réponse sont différentes, le navigateur ne reconnaît pas votre application et ne donne pas accès à ce cookie. C'est pourquoi l'application renvoie cette erreur.

9
Naren

Je peux reproduire cette erreur en appuyant plusieurs fois sur le bouton de retour de mon application Web, même après une connexion réussie. pouvez-vous essayer ces 2 choses: dans votre code ci-dessous:

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

ajoutez un validateur de protocole en tant qu'option d'authentification, en tant qu'erreur suggérée:

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

ou ajouter une notification, vous pouvez ainsi détecter cette erreur et la rediriger vers une page d'erreur. Je fais ça pour le rendre gracieux. Jusqu'à ce que Katana le répare.

Notifications = new OpenIdConnectAuthenticationNotifications
                        {
                            AuthenticationFailed = context =>
                            {
                                context.HandleResponse();
                                context.Response.Redirect("/Error.aspx?message=" + context.Exception.Message);
                                return Task.FromResult(0);
                            }
                        },
4
Abs

J'ai réussi à contourner ce problème en utilisant la méthode suivante dans le fichier Global.asax. Au moins, cela ne montrera pas l'exception au client. J'utilise ELMAH pour intercepter des 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");                 
        }
1
user6745503

Le problème ici est simple ... m'a pris des heures pour comprendre cela. Depuis que je testais sur mon local, je n'avais pas de https et pour vous dire la vérité lors de la création initiale de mon application dans Azure AD, car je ne m'attendais pas à ce que ce soit https lors de mon test, j'ai tout simplement indiqué http (URL de la page personnelle de replyUrl, déconnecter tout ce jazz).

Ensuite, j'ai rencontré le problème de la boucle infinie que beaucoup de gens se font avoir. Alors j'ai décidé de me moquer de la cert sur mon local et yep qui s'est débarrassé de la redirection infinate mais a ensuite apporté un autre le "IDX10311: RequireNonce est" vrai "" un

Longue histoire courte ... rendre votre application AzureAD https dans tous ses terminaux. et wallah!

1
Egli Becerra

Eh bien, il serait probablement préférable de regarder le code source de katana, à partir de là j'ai trouvé que le type d'exception était OpenIdConnectProtocolInvalidNonceException, donc je le gère comme ça.

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

J'ai cette exception popup sur les navigateurs qui mettent en cache les pages et les utilisateurs qui cliquent sur le bouton Retour après la connexion.

1
jonmeyer

Ajoutons juste un autre cas que je viens de rencontrer: le réseau auquel vous vous connectez est peut-être en train de modifier du contenu HTML.

Un client appelé avec un problème: il ne pouvait pas dépasser cette erreur. C'était un nouvel ordinateur portable sur lequel il ne s'était jamais connecté auparavant. Après environ une heure d’essai de plusieurs solutions possibles, j’ai décidé de vérifier le réseau auquel il était connecté.

Il s'avère qu'il était connecté à un réseau d'aéroport, ouvert et non sécurisé, et qu'il n'utilisait pas de service VPN (il manque un peu de SETA là). Je ne sais pas exactement qui exploitait ce réseau ni ce qu’ils faisaient, mais le service Azure AD doit avoir détecté une sorte de falsification du nonce.

Au moment où l'utilisateur s'est connecté à un réseau approuvé, le problème a été résolu.

0
SvenAelterman

@ zb3b answer + @jonmeyer answer :

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);
        },
        ...
    }
});
0
Daniel Genezini