2011-11-22 14 views
11

Tôi có một ứng dụng web nhận thức được yêu cầu sử dụng Windows Identity Foundation đã hoạt động tốt, ngoại trừ trên một máy chủ. Tôi thấy thông báo lỗi được hiển thị bên dưới trong nhật ký sự kiện.Microsoft.IdentityModel: Khóa không hợp lệ để sử dụng ở trạng thái được chỉ định

Exception information: 
    Exception type: CryptographicException 
    Exception message: Key not valid for use in specified state. 

    at System.Security.Cryptography.ProtectedData.Unprotect(Byte[] encryptedData, Byte[] optionalEntropy, DataProtectionScope scope) 
    at Microsoft.IdentityModel.Web.ProtectedDataCookieTransform.Decode(Byte[] encoded) 

Ứng dụng này đang sử dụng triển khai rất chuẩn của WIF với ADFS v2. Nó không sử dụng RsaEncryptionCookieTransform. Tôi đang tìm bất kỳ đề xuất nào về cách chẩn đoán điều này. Những điều tôi đã thử cho đến thời điểm này:

  1. Hồ bơi ứng dụng đang sử dụng bản sắc ASP.NET v4.0 có cài đặt "Tải hồ sơ người dùng" được đặt thành true.
  2. Tôi đã xóa thư mục C: \ Users \ ASP.NET v4.0 \ AppData và thấy điều này đã được tạo lại thành công.
  3. Tôi đã kiểm tra quyền trên khóa cá nhân chứng chỉ, điều này rất tốt. Tôi cũng đã thử vô hiệu hóa mã hóa mã thông báo mà không tạo ra bất kỳ sự khác biệt nào.

Mọi lời khuyên sẽ được đánh giá cao.

Trả lời

15

Điều này thường do ứng dụng không thể giải mã cookie mã thông báo xác thực. Đảm bảo rằng danh tính sở hữu App Pool có đủ quyền truy cập vào cửa hàng chứng chỉ của bạn. Hãy thử thay đổi Identity thành NetworkService và xem điều đó có hữu ích không.

Bạn cũng nên xóa cookie của trình duyệt để đảm bảo bạn không có cookie từ một ứng dụng khác được lưu trong bộ nhớ cache.

+1

Cảm ơn. Bạn đã xác nhận sự nghi ngờ của tôi rằng đây là cookie liên quan nên tôi đã làm rất nhiều thử và sai và thấy điều này là do một ứng dụng web bảo mật WIF khác (trên máy chủ khác) tạo một cookie WIF với đường dẫn/dường như đang cố giải mã bởi ứng dụng web này. Tôi đã sửa lỗi này bằng cách điều chỉnh các giá trị đường dẫn được cả hai ứng dụng sử dụng. Thật kỳ lạ là tôi chỉ thấy lỗi này với IE chứ không phải Firefox/Chrome. Tôi sẽ phải dành nhiều thời gian hơn với điều này để hiểu rõ hơn về vấn đề này. –

+0

Tôi đã chạy vào cùng một điều. Vui mừng bạn đã nhận nó làm việc ra. Tôi không chắc chắn lý do tại sao bạn sẽ chỉ thấy điều này trong IE, nhưng việc thay đổi đường dẫn cookie sẽ là bản sửa lỗi. –

+0

Tôi đã gặp vấn đề tương tự sau khi tôi vô tình xóa trang web địa phương của mình. Xóa cookie wif và asp.net đã thực hiện thủ thuật. –

7

Vấn đề được 100% tái sản xuất:

Thật vậy, sau khi ứng dụng đang được tái triển khai, VÀ cookie xác thực cũ còn lại trên máy client (khách hàng không đăng xuất) -đây lỗi xuất hiện cho khách hàng trên bất kỳ yêu cầu sau. Để khắc phục lỗi ứng dụng khách này, phải xóa cookie và/hoặc đăng nhập rồi đăng xuất khỏi STS. Khi hoàn tất - lỗi sẽ biến mất và mọi thứ đều ổn cho đến khi nâng cấp tiếp theo ....

Sau khi nghiên cứu, tôi nghĩ đây là lỗi trong SessionAuthenticationModule cần được sửa. Nếu bạn cẩn thận nhìn vào dấu vết stack ở trên, có một phương thức thú vị được gọi là TryReadSessionTokenFromCookie, đặt ra kỳ vọng rằng mô-đun xác thực sẽ "thử" để đọc mã thông báo từ cookie và sẽ trả về false nếu điều này không thành công. Resharper!):

public bool TryReadSessionTokenFromCookie(out SessionSecurityToken sessionToken) 
{ 
    byte[] sessionCookie = this.CookieHandler.Read(); 
    if (sessionCookie == null) 
    { 
     sessionToken = null; 
     return false; 
    } 
    sessionToken = this.ReadSessionTokenFromCookie(sessionCookie); 
    if (DiagnosticUtil.TraceUtil.ShouldTrace(TraceEventType.Verbose)) 
    { 
     DiagnosticUtil.TraceUtil.Trace(TraceEventType.Verbose, TraceCode.Diagnostics, SR.GetString("TraceValidateToken", new object[0]), new TokenTraceRecord(sessionToken), null); 
    } 
    return true; 
} 

Rõ ràng, mã không thành công trong phương pháp này với lỗi và nhà phát triển không có tùy chọn xử lý lỗi theo cách hợp lý hơn hoặc ít hơn. (... Hoặc ít nhất tôi không thể tìm thấy bất kỳ, vì mô-đun HTTP này không vượt qua lỗi này vào đối tượng HttpApplication để xử lý và ném nó vào mặt người dùng.) Vì vậy, tôi nghĩ có hai lỗi: 1) Trình quản lý mã thông báo bảo mật cần phải cụ thể hơn về lý do ném ID1073 (lỗi giải mã phía máy chủ hoặc lỗi cookie sai cũ) 2) Phải có cách để nhà phát triển xử lý lỗi này và đăng xuất người dùng, nếu nó xảy ra. Tôi sẽ BẤT CỨ trợ giúp về điều này ... Bất cứ ai có thể XIN tạo mã mẫu, cho biết cách chặn ngoại lệ này để người dùng có thể tự động đăng xuất khi lỗi này xảy ra không? Một lần nữa, sự kiện Application.Error dường như không bị sa thải khỏi mô-đun này - không chắc chắn những gì khác có thể được thực hiện để xử lý nó, ngoài việc viết SessionAuthenticationModule của riêng tôi. BẤT K HELP GIÚP NÀO ĐƯỢC CHẤP NHẬN CAO !!! Cảm ơn! Alex

+1

Trình xử lý toàn cầu Application_Error có vẻ là nơi thích hợp. Một cái gì đó dọc theo dòng 'var exc = Server.GetLastError();' 'if (exc là CryptographicException || exc.InnerException là CryptographicException)' '{Server.ClearError(); ResetAuthentication(); } ' đã hoạt động đối với tôi. – achekh

+1

Tôi đang đối mặt với cùng một vấn đề, mặc dù điều này xảy ra với tôi trên cơ sở thường xuyên hơn nhiều; hành vi tôi thấy cho thấy một số loại hết hạn đang xảy ra, để ứng dụng không thể đọc cookie mã thông báo. Tôi không hiểu tại sao bạn hoặc tôi thấy những hành vi mà chúng ta đang thấy. –

+5

@achekh Tôi rất tò mò về cách bạn triển khai ResetAuthentication? Bạn có thể vui lòng chia sẻ triển khai đó không! Cảm ơn! – Fore

1

Xóa cookie FedAuth có thể hoạt động. Khi ngoại lệ xảy ra, hãy thử này trong phương pháp Application_Error của tập tin Global.asax:

Microsoft.IdentityModel.Web.FederatedAuthentication.SessionAuthenticationModule.SignOut(); 
2

tôi giải quyết trường hợp của tôi, vì tôi có tên cookie cùng "FedAuth" cho hai ứng dụng (đây là tên mặc định). Chỉ cần đặt một tên khác nhau và đó là quyết tâm:

<system.identityModel.services> 
<federationConfiguration> 
    <cookieHandler name="ACookieName" /> 
</federationConfiguration> 

2

Sau đây làm việc cho tôi:

Bạn cần phải thêm phần để system.identityModel/identityConfiguration

tham khảo: SessionSecurityTokenHandler trying to decrypt SessionSecurityToken in RSA-encrypted cookie using DPAPI; why?

<system.identityModel> 
    <identityConfiguration saveBootstrapContext="true"> 
     <audienceUris> 
     <add value="yoursite.com" /> 
     </audienceUris> 
     <issuerNameRegistry type="Thinktecture.IdentityModel.Tokens.MetadataBasedIssuerNameRegistry, Thinktecture.IdentityModel"> 
     <trustedIssuerMetadata issuerName="urn:federation:company:stage" metadataAddress="https://federation-sts-stage.company.com/FederationMetadata/2007-06/FederationMetadata.xml"></trustedIssuerMetadata> 
     </issuerNameRegistry> 
     <certificateValidation certificateValidationMode="None" /> 
<securityTokenHandlers> 
    <add type="System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler, 
      System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 

     <remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, 
      System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    </securityTokenHandlers> 
    </identityConfiguration> 
    </system.identityModel>