2015-04-07 6 views
8

У меня есть приложение ASP.NET MVC 5, которое аутентифицируется против Azure Active Directory. Я хотел включить SSL на нем через приложение. и, следовательно, заемные средства глобальных фильтров следующим образом:Включение SSL в приложении ASP.NET MVC 5 в результате проблемы с OpenIdConnectProtocolValidator

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» в свойствах проекта в действительность. Это дало мне следующий URL-адрес SSL ->https://localhost:34567. Я обновил проект, чтобы иметь это на своем пути IIS Express в разделе «Веб-вкладка» под серверами в «URL проекта». Однако при запуске сайта я столкнулся со следующей ошибкой:

IDX10311: RequireNonce is 'true' (default) but validationContext.Nonce is null. A nonce cannot be validated. If you don't need to check the nonce, set OpenIdConnectProtocolValidator.RequireNonce to 'false'.

У меня есть автоответчик. разрешено на сайте. Я использую каталог Azure Active.

Код безопасности выглядит следующим образом:

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 ложь, как указано в сообщении об ошибке следующим образом:

ProtocolValidator = new OpenIdConnectProtocolValidator 
       { 
        RequireNonce = false 
       } 

Но это только привело к недопустимым запрос ошибки.

Может кто-нибудь помочь мне понять, в чем проблема? Все работало отлично, пока SSL не был включен.

+1

Думаю, я понял это. Приложение. детали в Azure AD жестко привязаны к исходной конечной точке HTTP. Обновит это, как только я подтвержу свою теорию. –

+0

Я получаю это тоже ... –

+0

Прошу, вам удалось исправить эту ошибку? Я в той же ситуации. – Mastenka

ответ

13

Вы можете игнорировать исключения, если сообщение об ошибке начинается с 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); 
    }, 
} 
+4

Не могли бы вы добавить еще некоторое описание решения, которое вы предоставляете? – abarisone

+1

Работал для меня в сценарии: пользователь использует кнопку «Назад назад», чтобы перейти на страницу аутентификации SSO. –

+0

Вы можете добавить описание к нему. –

2

Я могу воспроизвести эту ошибку, нажав кнопку «Назад» пару раз в своем веб-приложении, даже после успешного входа в систему. вы можете попробовать эти 2 вещи: в коде ниже:

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

протокол добавить валидатора как одно из параметров аутентификации, как то, что ошибка предложить:

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

или добавить уведомление, этим вы может уловить эту ошибку и перенаправить ее на страницу с ошибкой. Я делаю это, чтобы сделать его изящным. Пока Катана не исправляет это.

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

От управления портала Azure, убедитесь, что ваше приложение под соответствующей активной директории имеет тот же Sign On URL и ответ URL.

Если они не то же самое, вы получите эту ошибку.

Это происходит, когда вы включаете SSL, поскольку он изменяет только URL-адрес на URL-адрес HTTPS, в то время как URL-адрес ответа остается тем же URL-адресом HTTP.

Edit: Читайте дальше, если вы хотите, чтобы точно знать, почему это происходит,

При попытке открыть приложение, используя протокол HTTPS URL, он устанавливает куки с уникальным номером (Nonce) в вашем браузере и удаляет Azure AD для аутентификации. После аутентификации браузер должен предоставить доступ к этому файлу cookie. Но поскольку URL-адрес и URL-адрес для ответа различаются, браузер не распознает ваше приложение и не предоставляет доступ к этому файлу cookie, и, следовательно, приложение выдает эту ошибку.

1

Мне удалось обойти эту проблему, используя следующий метод в файле Global.asax. По крайней мере, это не покажет исключения для клиента. Я использую ELMAH для исключения исключений.

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");     
     } 
0

Ну это, вероятно, будет лучше, чтобы посмотреть на исходный код катана, от того я нашел тип исключения быть OpenIdConnectProtocolInvalidNonceException так я себе это так.

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

У меня есть это исключение всплывающее окно в браузерах, которые кэшируют страницы и пользователей, которые нажимают кнопку «Назад» после входа в систему.

0

Вопрос здесь прост ... взял мне часы, чтобы понять это. С тех пор, как я тестировал на своем локальном компьютере, не было https и рассказывал вам правду, когда изначально создавал свое приложение в Azure AD, так как я не ожидал, что он будет https во время моего теста, я сделал его простым http (url (url) replyUrl's Home, чтобы выйти из этого джаза)

Тогда после выполнения этого я столкнулся вопрос infinate цикла много людей получают. поэтому я решил издеваться над сертификатом на моем местном и да, который избавился от перенаправляемого потока, но затем добавил еще один «IDX10311: RequireNonce is true» »один

Короткий рассказ ... сделайте свой AzureAD App https во всех своих конечных точках. и стена!

0

Просто добавив еще один случай, на который я только что столкнулся: сеть, к которой вы подключаетесь, может изменять содержимое HTML.

Клиент, вызванный с проблемой: он не смог преодолеть эту ошибку. Это был новый ноутбук, на котором он раньше не вошел. Примерно через час после нескольких возможных решений я решил проверить сеть, к которой он был подключен.

Оказалось, что он подключен к сети в аэропорту, открыт и незащищен, а не использует службу VPN (там не хватает SETA). Я точно не знаю, кто управлял этой сетью или что они делали, но служба Azure AD должна была обнаружить какой-то тип несанкционированного доступа с помощью nonce.

В тот момент, когда пользователь подключился к доверенной сети, проблема была решена.