2010-02-16 4 views
20

Tôi có hai ứng dụng asp.net trên một máy chủ IIS và tôi muốn sử dụng cùng một cơ sở dữ liệu asp_security và nhà cung cấp thành viên. Tôi đã đọc rằng tất cả những gì tôi phải làm là tham chiếu cùng tên ứng dụng trong cả hai cấu hình web như tôi đang làm bây giờ, nhưng tôi phải làm điều gì đó sai:Sử dụng một cơ sở dữ liệu thành viên Asp.net với nhiều ứng dụng Đăng nhập một lần

Trong mỗi ứng dụng web.config Tôi có phần này.

<membership> 
    <providers> 
    <clear/> 
    <add name="AspNetSqlMembershipProvider" 
       type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
       connectionStringName="membership" 
       enablePasswordRetrieval="false" 
       enablePasswordReset="true" 
       requiresQuestionAndAnswer="false" 
       applicationName="/" 
       requiresUniqueEmail="false" 
       minRequiredPasswordLength="5" 
       minRequiredNonalphanumericCharacters="0" 
       passwordFormat="Hashed" 
       maxInvalidPasswordAttempts="5" 
       passwordAttemptWindow="10" 
       passwordStrengthRegularExpression="" 
       /> 
    </providers> 
</membership> 

Khi tôi đăng nhập từ ứng dụng A và duyệt đến ứng dụng B dường như không biết gì về tôi hoặc thông tin đăng nhập của tôi từ ứng dụng A. Bất kỳ ai có ý tưởng gì tôi đang làm không chính xác?

Trả lời

20

Chỉ vì mục đích đóng cửa, tôi sẽ trả lời cách tôi đã đạt được mục tiêu của câu hỏi ban đầu của tôi có ý nghĩa gì.

Tôi có hai ứng dụng asp.net trên một máy chủ IIS. Đó là mục tiêu của tôi để làm cho nó như vậy khi người dùng đăng nhập vào app1 thông tin đăng nhập người dùng của họ sẽ có sẵn trong app2. Cấu hình các nhà cung cấp thành viên asp.net chỉ là một bước của những gì tôi đang tìm kiếm. Ngay cả khi cả hai ứng dụng đều sử dụng cùng một cơ sở dữ liệu và nhà cung cấp cuối cùng thì tôi vẫn sẽ không được xác thực khi tôi nhấn app2. Những gì tôi đang tìm kiếm là một giải pháp Đăng nhập một lần.

Một khi bạn có cả ứng dụng trỏ tại cơ sở dữ liệu asp_membership của bạn bằng cách đặt sau trong phần system.web của cấu hình web của bạn

<authentication mode="Forms" /> 
<membership> 
    <providers> 
    <clear/> 
    <add name="AspNetSqlMembershipProvider" 
       type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
       connectionStringName="membership" 
       applicationName="/" 
       /> 
    </providers> 
</membership> 
<roleManager enabled="true" /> 

chắc chắn rằng cả hai đều có bộ tài sản ApplicationName cùng.

Tôi đã sử dụng IIS 6 vì vậy tôi đã định cấu hình để tự động tạo khóa máy cho cả hai ứng dụng. Vì cả hai ứng dụng này đều hoạt động trên cùng một máy nên khóa sẽ giống nhau, đây là phần quan trọng để làm cho SSO hoạt động. Sau khi thiết lập IIS, sau đây đã được thêm vào web.config của tôi

<machineKey decryptionKey="AutoGenerate" validation="SHA1" validationKey="AutoGenerate" /> 

Đó là tất cả những gì đã có. Một khi đã được thực hiện tôi có thể đăng nhập vào app1 và sau đó duyệt đến app2 và giữ thông tin bảo mật của tôi.

Cảm ơn bạn đã đẩy đúng hướng.

+1

Cảm ơn bạn rất nhiều! Vấn đề của bạn chính xác giống như tôi. Hầu hết các giải pháp SSO là khá phức tạp để có được đi và không bao giờ khá làm việc cho tôi, cảm ơn một lần nữa! – stillsmallvoice

2

Nếu sự hiểu biết của tôi phục vụ cho tôi một cách chính xác, các chữ ký xác thực người dùng được lưu trữ trong ngữ cảnh HTTP của từng ứng dụng. Vì vậy, việc chuyển đổi giữa hai ứng dụng sẽ không tự động xác thực người dùng, vì bối cảnh mới sẽ được tạo khi bạn chuyển sang ứng dụng B.

Tôi cho rằng cách tiếp cận chính xác sẽ là sử dụng thuộc tính DefaultCredentials (hoặc UseDefaultCredentials) True) của người dùng hiện tại trước khi chuyển sang ứng dụng B.

Khi bạn nói chuyển đổi, ý của bạn là gì. mở một cửa sổ trình duyệt khác và truy cập ứng dụng B hoặc yêu cầu một trang từ appB từ appA?

+0

Tôi nghĩ rằng bạn có thể đúng vì tôi có thể thấy cơ sở dữ liệu của mình ngay bây giờ nhưng không có người dùng đã đăng nhập khi tôi duyệt đến appB. API nào bạn đang đề cập đến khi bạn nói về DefaultCredentials? ... và nếu tôi định "chuyển đổi" giữa các ứng dụng theo bản đồ trang web, bạn có thấy cách thiết lập điều này trên mỗi trang khi thoát không? Cảm ơn bạn đã dành thời gian – jim

+2

Thuộc tính UseDefaultCredentials trong System.Net (http://msdn.microsoft.com/en-us/library/system.net.credentialcache.defaultcredentials.aspx). Về điểm thứ hai, tôi tin rằng bạn cần đặt khóa máy trong cả hai tệp web.config của ứng dụng. Xem bài viết MSDN này để biết thêm thông tin http://msdn.microsoft.com/en-us/library/eb0zx8fc.aspx – Ahmad

+1

bạn bị nhầm lẫn. Asp.net hình thức xác thực được theo dõi trong một vé được mã hóa. vé này có thể được lưu trữ trong cookie hoặc trong url. OP chỉ cần, như bây giờ anh ta biết, để đảm bảo rằng tên ứng dụng giống nhau và mỗi ứng dụng chia sẻ một khóa máy phổ biến. –