5

Tôi muốn sử dụng ASP.NET SimpleMembership để xác thực người dùng tiêu thụ WebAPI của tôi. Thinktecture có một thư viện xác thực tuyệt vời được gọi là Thinktecture.IdentityModel (http://thinktecture.github.com/Thinktecture.IdentityModel.45/) với một ví dụ liên kết Forms Auth với Basic Auth (source). Tuy nhiên, ví dụ sử dụng Membership.ValidateUser() không hoạt động nếu không có nhà cung cấp thành viên ASP.NET, không được SimpleMembership hỗ trợ (source) (chỉnh sửa: điều này không hoàn toàn đúng, xem câu trả lời của Mark bên dưới) .Thinktecture.IdentityModel with SimpleMembership


Sửa:

Dưới đây là những gì tôi đã làm:

1) Tạo một MVC Internet Application mới

2) Cài đặt Thinktecture.IdentityModel qua NuGet

3) Tạo mô hình và bộ điều khiển api qua giàn giáo:

public class Goober 
{ 
    public int GooberId { get; set; } 
    public string GooberWords { get; set; } 
} 

4) Ran dự án, tạo một người dùng mới và tạo ra một Goober mới sử dụng Fiddler

5) thêm [Duyệt] để GetGoober (int id)

6) Trong WebApiConfig.cs thêm:

var authConfig = new AuthenticationConfiguration(); 

authConfig.AddBasicAuthentication((userName, password) => 
    Membership.ValidateUser(userName, password)); 

config.MessageHandlers.Add(new AuthenticationHandler(authConfig)); 

Khi tôi chạy dự án và nhấn api/Goober/1 với Fiddler tôi nhận được một 401 www-Authenticate: không xác định. Nhưng nếu tôi đăng nhập đầu tiên bằng cách sử dụng AccountController sau đó sử dụng Fiddler tôi nhận được một và tất cả mọi thứ là đào.

Sửa

Được rồi, tôi nghĩ rằng vấn đề không liên quan đến câu hỏi ban đầu của tôi. Tôi nghi ngờ nó liên quan đến việc khởi tạo SimpleMembership trong khuôn mẫu. Khi tôi mở dự án và chạy gỡ lỗi sau đó nhấn api với Fiddler tôi không thể vượt qua Auth. Nhưng khi tôi chỉ cần nhấp vào liên kết "đăng ký" trên giao diện web, tôi sẽ vượt qua Auth. Tôi đoán đó là vì InitializeSimpleMembershipAttribute được gọi tại AccountController vì vậy không khởi tạo cho đến khi bộ điều khiển được gọi?


Tôi đã thử sử dụng WebSecurity.Login() thay cho Membership.ValidateUser() nhưng điều đó không hiệu quả.

Tôi đang thua lỗ về cách thực hiện điều này. Có ai có lời khuyên nào? Hoặc có lẽ tôi đang cố gắng giải quyết vấn đề này từ góc độ sai?

Trả lời

3

Bạn chính xác rằng nhà cung cấp thành viên ASP.NET không tương thích với SimpleMembershipProvider tuy nhiên SimpleMembershipProvider không hỗ trợ ValidateUser, xem here. Giả sử SimpleMembership được cấu hình đúng và initalised bạn vẫn có thể gọi Membership.ValidateUser().

Nếu bạn đã thử Membership.ValidateUser() và gặp lỗi, vui lòng cho tôi biết và chúng tôi có thể thử giải quyết.

Cập nhật

Vì vậy, khi tiếp bước sinh sản của bạn tôi đã quản lý để pin-point lỗi. Sau khi đã đưa nội dung xử lý nội suy theo quy tắc AuthenticationHandler của Thinktecture và chạy trong gỡ lỗi. 30 giây sau khi một yêu cầu đến bộ điều khiển api lỗi kết nối cơ sở dữ liệu đang được nâng lên. Điều này là không đồng bộ và âm thầm.

Sau khi một số khó khăn xung quanh tôi tin rằng đó là chuỗi kết nối DefaultConnection có lỗi.

Giống như tôi kết nối mặc định của bạn có thể chứa một tên tập tin như thế này: AttachDBFilename = | DataDirectory | \ aspnet-MvcApplication3-20121215104323.mdf"

Khi ValidateUser được gọi bên trong các đại biểu đăng ký tại ứng dụng khởi động (ví chứng thực thông tin) nó dường như thất bại trong việc giải quyết |DataDirectory| tôi thấy rằng bằng cách cập nhật con đường này với tên đầy đủ các vấn đề kết nối của tôi ra đi.

<connectionStrings> 
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-MvcApplication3-20121215104323;Integrated Security=SSPI;AttachDBFilename=C:\mydatabase\file\path\example\aspnet-MvcApplication-20121215104323.mdf" providerName="System.Data.SqlClient" /> 
</connectionStrings> 

sau đó tôi tìm thấy bài này here, nó chỉ ra rằng AppDomain có không đã có nó thư mục dữ liệu được đặt chính xác tại thời điểm này.

Vì vậy, một khi cấu hình thiết lập và các chuỗi kết nối thay đổi với một đường dẫn tập tin thích hợp và một tên người dùng "test" và một "thử nghiệm" password yêu cầu này thông qua cáy có một 200:

GET http://localhost/api/goober/1 
User-Agent: Fiddler 
Host: localhost 
Authorization: Basic dGVzdDp0ZXN0aW5n 

Là một sang một bên

Tôi thấy rằng để nhận mã thông báo ủy quyền biểu mẫu cũng cho phép truy cập vào bộ điều khiển api, tôi phải thêm phần này. Nếu không mã Thinkteckture đặt nguyên tắc trở về ẩn danh:

Thêm này

authConfig.InheritHostClientIdentity = true; 

Để chống this (dòng 52):

if (_authN.Configuration.InheritHostClientIdentity == false) 
{ 
    //Tracing.Information(Area.HttpAuthentication, "Setting anonymous principal"); 
    SetPrincipal(Principal.Anonymous); 
} 
+0

Hi Mark - nhờ trả lời! Tôi đã thử Membership.ValidateUser() nhưng không thể làm cho nó hoạt động. Tôi sẽ cập nhật câu hỏi của mình vào ngày mai khi tôi quay lại văn phòng. Tôi đánh giá cao sự giúp đỡ của bạn! – brudert

+0

@brudert công cụ tuyệt vời, hãy cho tôi biết lỗi này là gì đối với ValidateUser() và chúng tôi có thể sửa lỗi đó. –

+0

cảm ơn, tôi đã cập nhật câu hỏi của mình với nhiều chi tiết hơn – brudert