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?
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
@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 đó. –
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