2015-10-16 14 views
5

Chúng tôi có một môi trường như sau:Làm thế nào để thiết lập cookie xác thực dựa với NancyFx và IdentityServer3 (phi API trang web)

  • độc IdentityServer3 dụ (vấn đề tham khảo thẻ, không JWT)
  • ASP.NET WebAPI máy chủ tài nguyên
  • ứng dụng .NET client rằng xác thực đối với IdSvr (thông qua dòng chảy chủ sở hữu tài nguyên)

... và bây giờ chúng tôi muốn bắt đầu thêm một ứng dụng web được lưu trữ trên OWIN sẽ sử dụng NancyFx để phục vụ các trang được hiển thị trên máy chủ cũng như một vài AngularJS SPA. Trang web Nancy này sẽ KHÔNG lưu trữ bất kỳ API nào, nhưng có thể tiêu thụ dữ liệu từ API hiện tại của chúng tôi. Tôi muốn thêm xác thực trong đường ống OWIN để giúp bảo mật các ứng dụng Angular của chúng tôi khỏi bị gửi xuống cho người dùng không có quyền truy cập.

Điều này ngược lại với việc gửi mã SPA xuống và có Angular xác định xem người dùng có thấy gì không. Trong trường hợp đó, chúng tôi đã tiếp xúc với cơ sở mã javascript và điều này chúng tôi muốn tránh.

Tôi đang cố gắng hiểu cách tôi nên định cấu hình trang web Nancy này để xác thực người dùng chống lại IdentityServer bằng luồng ngầm. Tôi đã thực hiện lược đồ xác thực này trong các SPA độc lập trước đó (nơi tất cả các xác thực được xử lý bởi mã AngularJS và mã thông báo được lưu trữ trong bộ nhớ cục bộ HTML5), nhưng tôi bị mất một chút về cách xử lý đúng cách này trong đường ống OWIN.

Tôi nghĩ rằng thiết bị trung gian xác thực cookie OWIN là câu trả lời, nhưng điều đó có nghĩa là sau?

  • Tôi cần chuyển hướng người dùng đến IdentityServer (sử dụng các đối số url thích hợp cho luồng ngầm)?
  • IdentityServer sẽ chuyển hướng người dùng quay lại trang web của tôi khi đăng nhập thành công, vì vậy tôi có thể sử dụng trình quản lý ủy quyền OWIN để đặt cookie thích hợp ở đâu?

... hoặc tôi có nghĩ về điều này không?

Để tham khảo, tôi đã đọc qua các bài đăng sau đây và chúng rất hữu ích nhưng tôi không thấy bức tranh lớn với OWIN. Tôi sẽ thử nghiệm với các sản phẩm trung gian UseOpenIdConnectAuthentication tiếp theo, nhưng tôi sẽ đánh giá cao bất kỳ hướng dẫn nào có thể có ở đây.

http://brockallen.com/2013/10/24/a-primer-on-owin-cookie-authentication-middleware-for-the-asp-net-developer/

https://github.com/IdentityServer/IdentityServer3/issues/487

Trả lời

4

Về cơ bản, thực hiện xác thực OpenID Connect trong một ứng dụng Nancy lưu trữ thông qua OWIN thực sự không khác biệt so với thực hiện nó trong bất kỳ ứng dụng MVC/Katana (đội Thinktecture có một mẫu cho điều này trường hợp: https://github.com/IdentityServer/IdentityServer3.Samples/tree/master/source/Clients/MVC%20OWIN%20Client)

Về cơ bản bạn cần 3 thứ: phần mềm trung gian cookie, phần mềm trung gian OpenID Connect và phần mềm trung gian Nancy:

public class Startup { 
    public void Configuration(IAppBuilder app) { 
     app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions { 
      AuthenticationMode = AuthenticationMode.Active, 
      AuthenticationType = CookieAuthenticationDefaults.AuthenticationType 
     }); 

     app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions { 
      AuthenticationMode = AuthenticationMode.Active, 

      // Set the address of your OpenID Connect server: 
      Authority = "http://localhost:54541/" 

      // Set your client identifier here: 
      ClientId = "myClient", 

      // Set the redirect_uri and post_logout_redirect_uri 
      // corresponding to your application: 
      RedirectUri = "http://localhost:56765/oidc", 
      PostLogoutRedirectUri = "http://localhost:56765/" 
     }); 

     app.UseNancy(options => options.PerformPassThrough = context => context.Response.StatusCode == HttpStatusCode.NotFound); 
    } 
} 

Nếu bạn đang tìm bản trình diễn chức năng, bạn có thể xem https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/tree/dev/samples/Nancy/Nancy.Client (lưu ý: nó không sử dụng IdentityServer3 cho phần máy chủ OIDC nhưng nó không tạo sự khác biệt cho ứng dụng khách).

+0

Điều này rất hữu ích. Tôi bắt đầu hiểu cách thức này hoạt động như thế nào kể từ khi đăng câu hỏi của tôi, nhưng liên kết của bạn tới ví dụ AspNet.Security đó đã giúp lấp đầy khoảng trống cuối cùng (đặc biệt là xung quanh kích hoạt chuyển hướng tới OIDC để đăng nhập/đăng xuất). Điều duy nhất tôi sẽ đề nghị thêm vào ví dụ của bạn là làm thế nào để tận dụng các cuộc gọi lại OpenIdConnectAuthenticationNotifications. Mặc dù máy chủ OIDC không quan trọng lắm, tôi cần tạo lại AuthenticationTicket trong cuộc gọi lại SecurityTokenValidated để đáp ứng các nhu cầu cụ thể của mình. –

+0

Cảm ơn bạn đã đề xuất. Tôi đã xóa thông báo để giữ câu trả lời đơn giản nhất có thể. Bạn có thể tìm thấy toàn bộ mẫu mã ở đó (với thông báo triển khai hỗ trợ luồng hỗn hợp và lưu trữ mã thông báo tự động): https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/blob/dev/samples/Nancy/Nancy .Client/Startup.cs – Pinpoint

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