2015-04-07 17 views
8

Tôi có ứng dụng ASP.NET MVC 5 xác thực đối với Azure Active Directory. Tôi muốn bật SSL trên ứng dụng. và do đó các bộ lọc toàn cầu được tận dụng như sau:Bật SSL trong kết quả ứng dụng ASP.NET MVC 5 trong vấn đề 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()); 
    } 
} 

Sau này, tôi cũng đặt 'Bật SSL' trong thuộc tính của dự án thành đúng. Điều này đã cho tôi URL SSL sau ->https://localhost:34567. Tôi cập nhật dự án để có điều này trong đường dẫn IIS Express của nó dưới 'Tab Web' dưới Máy chủ trong 'URL dự án'. Tuy nhiên, khi chạy trang web tôi chạy đến lỗi sau:

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'.

Tôi có xác thực. được bật trên trang web. Tôi sử dụng thư mục Azure Active.

Mã bảo mật là như sau:

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

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

Các auth. giá trị đang được đọc từ web.config và như sau:

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

Tôi đã cố gắng thiết lập RequireNonce false theo chỉ dẫn trong thông báo lỗi như sau:

ProtocolValidator = new OpenIdConnectProtocolValidator 
       { 
        RequireNonce = false 
       } 

Nhưng điều này chỉ dẫn đến sự không hợp lệ Yêu cầu lỗi.

Ai đó có thể giúp tôi hiểu vấn đề ở đây không? Mọi thứ hoạt động tốt cho đến khi SSL được bật.

+1

Hãy suy nghĩ tôi đã tìm ra điều này. Ứng dụng. thông tin chi tiết trong Azure AD được hardwired phụ thuộc vào điểm cuối HTTP gốc. Sẽ cập nhật điều này một khi tôi đã xác nhận lý thuyết của tôi. –

+0

Tôi cũng đang nhận được điều này ... –

+0

Xin vui lòng, bạn đã quản lý để sửa lỗi này? Tôi đang ở trong tình trạng tương tự. – Mastenka

Trả lời

13

Bạn có thể bỏ qua ngoại lệ nếu thông báo lỗi bắt đầu bằng OICE_20004 hoặc chứa IDX10311. Lưu ý: tự mình làm điều đó.

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

Bạn có thể thêm một số mô tả khác vào giải pháp bạn cung cấp không? – abarisone

+1

Làm việc cho tôi, trong kịch bản: người dùng sử dụng nút quay lại trình duyệt để điều hướng đến trang xác thực SSO. –

+0

bạn có thể thêm một số mô tả cho nó không. –

2

Tôi có thể tạo lại lỗi này bằng cách nhấn nút quay lại vài lần trên ứng dụng web của mình, ngay cả sau khi đăng nhập thành công. bạn có thể thử những 2 điều: trong mã của bạn dưới đây:

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

add giao thức xác nhận như trên các tùy chọn xác thực, như những gì lỗi đề nghị:

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

hoặc thêm thông báo, bằng cách này bạn có thể bắt lỗi này và chuyển hướng nó đến một số trang lỗi. Tôi làm điều đó để làm cho nó duyên dáng. Cho đến khi Katana sửa chữa nó.

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

Từ cổng thông tin quản lý Azure, kiểm tra xem ứng dụng của bạn trong thư mục hoạt động tương ứng có cùng Sign On URLtrả lời URL.

Nếu họ không giống nhau, bạn sẽ nhận được lỗi này.

Điều này xảy ra khi bạn bật SSL vì nó chỉ thay đổi dấu hiệu trên URL thành URL HTTPS trong khi URL trả lời vẫn là cùng một URL HTTP.

Edit: Đọc nếu bạn muốn biết chính xác lý do tại sao điều này xảy ra,

Khi bạn cố gắng truy cập vào ứng dụng của bạn bằng cách sử dụng URL https, nó đặt một cookie với một số duy nhất (nonce) trong trình duyệt của bạn và truy cập Azure AD để xác thực. Sau khi xác thực, trình duyệt phải cấp quyền truy cập vào cookie đó. Nhưng vì dấu hiệu trên URL và URL trả lời khác nhau nên trình duyệt không nhận ra ứng dụng của bạn và không cấp quyền truy cập vào cookie đó và do đó ứng dụng sẽ phát ra lỗi này.

1

Tôi quản lý để khắc phục sự cố này bằng phương pháp sau trong tệp Global.asax. Ít nhất điều này sẽ không hiển thị ngoại lệ cho khách hàng. Tôi sử dụng ELMAH để bắt ngoại lệ.

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

Vâng nó có lẽ sẽ là tốt nhất để nhìn vào mã nguồn katana, từ đó tôi tìm thấy các loại ngoại lệ là OpenIdConnectProtocolInvalidNonceException vì vậy tôi xử lý nó như thế này.

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

Tôi có cửa sổ bật lên ngoại lệ này trên trình duyệt lưu vào bộ nhớ cache các trang và người dùng nhấp vào nút quay lại sau khi đăng nhập.

0

Vấn đề ở đây rất đơn giản ... đã dành cho tôi số giờ để tìm hiểu điều này. Vì tôi đã thử nghiệm trên địa phương của tôi không có https và để cho bạn biết sự thật khi ban đầu tạo ứng dụng của tôi trong Azure AD kể từ khi tôi không mong nó là https trong thử nghiệm của tôi, tôi đã làm cho nó đơn giản http (url HomePage của replyUrl, Đăng xuất tất cả nhạc jazz đó)

Sau đó, sau khi thực hiện việc này tôi gặp phải sự cố ngắt vòng lặp nhiều người đang nhận được. vì vậy sau đó tôi quyết định thử cert trên địa phương và yep của tôi mà đã thoát khỏi chuyển hướng infinate nhưng sau đó mang lại một số khác "IDX10311: RequireNonce là 'true'" một

Câu chuyện dài ngắn ... làm cho AzureAD của bạn App https trong tất cả các điểm cuối của nó. và wallah!

0

Chỉ cần thêm trường hợp khác mà tôi vừa chạy vào: mạng bạn kết nối có thể đang sửa đổi nội dung HTML.

Một khách hàng được gọi với một vấn đề: anh ấy không thể vượt qua lỗi này. Đó là một chiếc máy tính xách tay mới mà anh chưa đăng nhập trước đó. Sau khoảng một giờ thử một số giải pháp có thể, tôi đã quyết định kiểm tra mạng mà anh ta đã kết nối.

Hóa ra anh ta được kết nối với mạng trong một sân bay, mở và không có bảo đảm và không sử dụng dịch vụ VPN (thiếu một số SETA ở đó). Tôi không biết chính xác ai điều hành mạng đó hoặc những gì họ đang làm, nhưng dịch vụ Azure AD phải phát hiện một số loại giả mạo với nonce.

Thời điểm người dùng kết nối với mạng đáng tin cậy, sự cố đã được giải quyết.

Các vấn đề liên quan