2014-04-24 24 views
13

Tôi có trang web mạng nội bộ MVC cần sử dụng tài khoản AD để xác thực.Sử dụng gói Liên kết WIN OWIN để xác thực với ADFS 3.0

Tôi thiết lập ADFS 3.0 (Win Server 2012 R2) và theo sau this để thiết lập ADFS Relying Party Trust.

This bài đăng khác giới thiệu thành phần OWS Liên kết Ws và tôi muốn sử dụng nó. Nó đề cập đến cách kết nối với Azure AD nhưng không có gì liên quan đến ADFS.

tôi đã cố gắng thiết lập các thuộc tính cấu hình "MetadataAddress" và "Wtrealm" để phù hợp với những gì tôi được cấu hình trong ADFS nhưng khi chạy tôi nhận được một lỗi:

A default value for SignInAsAuthenticationType was not found in IAppBuilder Properties. 
This can happen if your authentication middleware are added in the wrong order, or if one is missing. 

Tôi đang tìm kiếm một cách thích hợp loại bỏ lỗi này

Trả lời

23

Vâng .. Tôi đã gặp phải vấn đề tương tự. Chỉ cần làm như sau và nó sẽ hoạt động:

app.SetDefaultSignInAsAuthenticationType(WsFederationAuthenticationDefaults.AuthenticationType); 

    app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType 
    }); 
+0

cần cài đặt gói Microsoft.Owin.Security.Cookies – BozoJoe

1

Thực ra, bạn chỉ thiếu dòng này thường là trước cuộc gọi phương thức UseCookieAuthentication.

app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

trong trường hợp của bạn nó sẽ là

app.UseExternalSignInCookie(WsFederationAuthenticationDefaults.AuthenticationType); 

Đây là những gì thực sự được thực hiện khi bạn gọi UseExternalSignInCookie (...), externalAuthenticationType là những gì bạn vượt qua trong khi các tham số chuỗi.

app.SetDefaultSignInAsAuthenticationType(externalAuthenticationType); 
CookieAuthenticationOptions options = new CookieAuthenticationOptions(); 
options.AuthenticationType = externalAuthenticationType; 
options.AuthenticationMode = AuthenticationMode.Passive; 
options.CookieName = ".AspNet." + externalAuthenticationType; 
options.ExpireTimeSpan = TimeSpan.FromMinutes(5.0); 
app.UseCookieAuthentication(options); 

Vì vậy, nếu tất cả các bạn đang đặt là AuthenticationType, bạn có thể an toàn chỉ cần gọi UseExternalSignInCookie như nó cho bạn.

13

Tôi đã cố gắng để có được đầu của tôi xung quanh này trong một thời bây giờ, và với lời cảm ơn đặc biệt để Lars KemmannTratcher, tôi tin rằng cách chấp nhận làm điều này là như sau:

app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 

app.UseCookieAuthentication(
    new CookieAuthenticationOptions { } 
); 

app.UseWsFederationAuthentication(
    new WsFederationAuthenticationOptions 
    { 
     Wtrealm = ConfigurationManager.AppSettings["ida:Wtrealm"], 
     MetadataAddress = ConfigurationManager.AppSettings["ida:FedMetadataURI"] 
    } 
); 

Dường phản đối trực quan rằng bạn đang định cấu hình loại xác thực mặc định là 'Xác thực Cookie' để WsFederation hoạt động, tuy nhiên đây thực sự là chuỗi được sử dụng để nhận dạng từng phần trung gian (điều này cho phép bạn đăng ký cùng loại phần mềm trung gian nhiều lần, ví dụ), họ đánh giá như sau:

  • CookieAuthenticationDefaults.AuthenticationType = "Cookies"
  • WsFederationAuthenticationDefaults.AuthenticationType = "Liên đoàn"

gì đang xảy ra ở đây là chúng ta đang nói OWIN rằng middleware có nhãn "Cookies" nên được sử dụng theo mặc định để xác thực yêu cầu, sau đó chúng tôi thêm phần mềm trung gian CookieAuthentication (theo mặc định, nhãn này được gắn nhãn "Cookies" từ giá trị CookieAuthenticationDefaults.AuthenticationType, vì vậy chúng tôi không phải viết bất kỳ mã bổ sung nào để thiết lập), cuối cùng chúng tôi thêm phần mềm trung gian FederationAuthentication (được gắn nhãn là WsFederationAuthenticationDefaults.AuthenticationType - nghĩa là " Liên kết "), sự hiểu biết của tôi là Middleware của Liên đoàn sử dụng phần mềm trung gian Cookie để quản lý các cookie liên quan đến xác thực của nó.

Tất cả những gì còn lại nó để làm được cấu hình ứng dụng của bạn để gọi middleware tại một thời điểm lựa chọn của bạn, điều này có thể đạt được trong một số cách khác nhau, một số trong đó như sau:

  • Bằng trở về một phản hồi HTTP 401
  • Bằng cách sử dụng các thuộc tính [Authorize] trên một MVC Controller
  • Bằng cách gọi bối cảnh OWIN IAuthenticationManager 's Challenge phương pháp (thông qua trong nhãn của middleware Liên kết của bạn)

Khi tôi hỏi câu hỏi này here, Lars đã trả lời với một ví dụ rất rõ ràng để làm thế nào để yêu cầu xác thực cho tất cả các yêu cầu, tôi sau đó đóng gói nó vào đường ống OWIN như sau:

app.Use(
    (context, continuation) => 
    { 
     if (
      (context.Authentication.User != null) && 
      (context.Authentication.User.Identity != null) && 
      (context.Authentication.User.Identity.IsAuthenticated) 
     ) 
     { 
      return continuation(); 
     } 
     else 
     { 
      context.Authentication.Challenge(WsFederationAuthenticationDefaults.AuthenticationType); 

      return Task.Delay(0); 
     } 
    } 
); 

Lưu ý rằng trong ví dụ đầu tiên ở trên, tôi di chuyển Wtrealmgiá trị MetadataAddress vào tập tin cấu hình của tôi để dễ bảo trì, họ cài đặt ứng dụng chỉ đơn giản:

<appSettings> 
    <add key="ida:Wtrealm" value="[app-uri]" /> 
    <add key="ida:FedMetadataURI" value="https://[adfs-server]/federationmetadata/2007-06/federationmetadata.xml" /> 
</appSettings> 

tôi hi vọng điêu nay co ich.

+1

Chính xác. Bạn có thể thấy rằng cách tiếp cận được khuyến nghị của Microsoft chính xác là bằng cách xem mẫu được cung cấp trên GitHub bởi Vittorio Bertocci: https://github.com/AzureADSamples/WebApp-WSFederation-DotNet/blob/master/WebApp-WSFederation-DotNet/App_Start/ Startup.Auth.cs –

+0

Tôi thấy rằng việc sử dụng ** app.SetDefaultSignInAsAuthenticationType (CookieAuthenticationDefaults.AuthenticationType); ** dẫn đến vòng lặp xác thực dẫn đến ngoại lệ: ** MSIS7042: Phiên trình duyệt khách hàng tương tự đã thực hiện '6' yêu cầu trong '1' giây cuối cùng ** trong khi ** app.SetDefaultSignInAsAuthenticationType (WsFederationAuthenticationDefaults.AuthenticationType); ** làm việc cho tôi; và chắc chắn đã chuyển cookie sau lần bắt tay xác thực ban đầu – AndyWarby

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