Không có những điều như cách tốt nhất và câu trả lời luôn luôn là it depends
, mặc dù rất vô ích. Bạn có thể sử dụng forms authentication chẳng hạn. Nếu ứng dụng web của bạn sử dụng dịch vụ web và dịch vụ web là một phần của cùng một ASP.NET application
, trình duyệt có thể liên tục gửi vé xác thực biểu mẫu (cookie) cho mọi cuộc gọi đến dịch vụ web.
Trong tập tin cấu hình, bạn có thể có
<authorization>
<deny users="?" />
</authorization>
này sẽ từ chối truy cập cho người dùng ẩn danh và điều đó sẽ bao gồm các dịch vụ web là tốt. Nói cách khác, trừ khi người dùng đăng nhập và nhận được một cookie hợp lệ với vé, dịch vụ không thể được sử dụng. Tất nhiên, bạn phải HTTPS
. Nếu không, bất kỳ một ở giữa có thể nhận được cookie trong các tiêu đề và gọi dịch vụ của bạn.
Cuối cùng, không thể đảm bảo không ai gọi dịch vụ web bên ngoài ứng dụng của bạn theo nghĩa tuyệt đối. Cách tiếp cận trên đảm bảo không có người nào ở giữa gọi dịch vụ của bạn. Nhưng không có cách nào để đảm bảo người dùng hợp lệ gọi dịch vụ trực tiếp bên ngoài ứng dụng của bạn vì người gọi dịch vụ web là JavaScript và bất kỳ bảo mật nào bạn tạo trong JavaScript có thể dễ dàng được người dùng tìm ra bằng cách xem tập lệnh hoặc thậm chí xem lưu lượng truy cập từ và đến trình duyệt. Bất kỳ người dùng cuối nào có chút kỹ thuật, sẽ có thể phát lại yêu cầu hoặc sửa đổi yêu cầu và gửi tới dịch vụ web của bạn bằng thông tin đăng nhập hợp lệ.
EDIT: -
Sau đây là các chi tiết bạn đang tìm kiếm để cho phép FormsAuthentication.
(1) Trong Web.config
, dưới <system.web>
, đảm bảo bạn có điều này.
<authentication mode="Forms">
<forms loginUrl="Login.aspx" defaultUrl="~/" />
</authentication>
<authorization>
<deny users="?" />
</authorization>
Điều này sẽ đảm bảo tất cả người dùng không được xác thực (ẩn danh) được chuyển hướng đến Login.aspx.
(2) Thực hiện Login.aspx
với logic đăng nhập của bạn để nhận ID người dùng và mật khẩu và xác thực chúng dựa trên cơ sở dữ liệu hoặc bất kỳ thứ gì. Sau khi xác thực thành công, tức là, người dùng đã nhập ID và mật khẩu khớp với những gì bạn có trong cơ sở dữ liệu, có thể là trong trình xử lý nhấn nút đăng nhập, hãy đặt vé.
protected void Button1_Click(object sender, EventArgs e)
{
// Do all your login logic here
// once user ID and password entered by the user are okay, call this
string ticket = FormsAuthentication.Encrypt(
new FormsAuthenticationTicket("userId", false, 15));
HttpCookie FormsCookie = new HttpCookie(
FormsAuthentication.FormsCookieName, ticket) { HttpOnly = true };
HttpContext.Current.Response.Cookies.Add(FormsCookie);
}
(3) Thêm PrincipalPermissionAttribute
vào phương pháp web như thế này.
public class Users : System.Web.Services.WebService
{
[PrincipalPermissionAttribute(SecurityAction.Demand)]
[WebMethod]
public List<User> GetUsers()
{
// Same code as what you have now
}
}
Nếu bây giờ bạn truy cập bất kỳ trang nào, bạn sẽ được chuyển hướng đến login.aspx nơi bạn sẽ cần nhập ID người dùng và mật khẩu và đăng nhập. Khi đăng nhập, cookie xác thực biểu mẫu sẽ được tạo và ghi vào phản hồi.Từ thời điểm đó trở đi, tất cả các yêu cầu đến ứng dụng của bạn sẽ mang lại cho cookie (trình duyệt sẽ làm điều đó cho bạn). Nếu không đăng nhập, nếu bạn truy cập trực tiếp vào dịch vụ web, bạn sẽ vẫn được chuyển hướng đến trang đăng nhập. Như tôi đã đề cập trong câu trả lời ban đầu của tôi, tuy nhiên người dùng đã đăng nhập vẫn có thể truy cập trực tiếp vào dịch vụ web. Nếu JavaScript có thể làm điều gì đó, người dùng có thể làm như vậy.
BTW, dịch vụ web (asmx) là công nghệ không dùng nữa.
ứng dụng mà các cuộc gọi dịch vụ web là gì? ASP.NET Web Forms, MVC? Là một phần .asmx của cùng một ứng dụng? Ứng dụng web gọi .asmx được bảo mật như thế nào? Bạn có đang sử dụng Xác thực biểu mẫu cho điều đó không? – Badri
@Badri - Cảm ơn bạn đã đặt câu hỏi. Tôi sử dụng ASP.NET Web Forms. Asmx nằm trong cùng một ứng dụng. Tôi làm một ứng dụng trò chuyện và tôi muốn sử dụng dịch vụ web để lưu tin nhắn và truy xuất tin nhắn mới. Tôi muốn thực hiện dịch vụ web an toàn để gửi tin nhắn trò chuyện. Trò chuyện chỉ có thể sử dụng người dùng đã đăng ký. Để xác thực tôi muốn sử dụng xác thực biểu mẫu. – Jenan