2012-09-14 37 views
10

Có khoảnh khắc mã bị mù.Nhà cung cấp thành viên nào triển khai người dùng được lưu trữ trong web.config?

ASP.NET 4.0.

Web.config:

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <authentication mode="Forms"> 
     <forms name="DataViewer" loginUrl="login.aspx"> 
     <credentials passwordFormat="Clear"> 
      <user name="devuser" password="test" /> 
     </credentials> 
     </forms> 
    </authentication> 
    <authorization> 
     <deny users="?" /> 
    </authorization> 
    </system.web> 

và một điều khiển đăng nhập:

<asp:Login ID="login" runat="server" /> 

Nếu tôi nhập tên người dùng và mật khẩu, và nhấn Login, nó bị treo.

Nếu tôi ngắt, tôi có thể thấy trong ngăn xếp cuộc gọi login.AuthenticateUsingMembershipProvider() đang ở giữa gọi SqlMembershipProvider.ValidateUser(). Không có cơ sở dữ liệu nào được định nghĩa hoặc tham gia vào dự án này chút nào, và tôi đã không chỉ định rằng SqlMembershipProvider nên được sử dụng.

Vì vậy, câu hỏi của tôi là, nhà cung cấp thành viên nào tôi nên sử dụng để có được ASP.NET sử dụng tên người dùng và mật khẩu trong phần tử <credentials> của web.config?

+0

có thể là do nhà cung cấp thành viên mặc định là AspNetSqlProvider sử dụng cơ sở dữ liệu SQL Server làm kho lưu trữ của người dùng. – Scorpio

+0

Tôi hy vọng đây là giải pháp tạm thời. Nó sẽ trở nên rất khó khăn để duy trì thông tin đăng nhập trong web.config vì mỗi thay đổi sẽ khởi động lại ứng dụng web. – jrummell

+0

Tất nhiên. Tuy nhiên nó phù hợp cho kịch bản trong tầm tay.Tôi cần phải cung cấp bảo vệ tầm thường cho một ứng dụng đơn giản cho một người dùng (bao giờ) có mật khẩu sẽ không bao giờ thay đổi. Một giải pháp với phụ thuộc lớn hơn là không thích hợp. – tomfanning

Trả lời

14

Tôi rất ngạc nhiên khi xem xét cách các nhà thiết kế khung làm việc gặp khó khăn khi xác định yếu tố <credentials /> mà họ không triển khai bất kỳ mã nào để sử dụng nó.

Tôi đã tìm thấy triển khai sắp xếp hoạt động của here mà tôi đã sửa và đưa vào bên dưới. Tất cả các thành viên khác của MembershipProvider ném NotImplementedException.

using System.Configuration; 
using System.Web.Configuration; 
using System.Web.Security; 

public class WebConfigMembershipProvider : MembershipProvider 
{ 
    private FormsAuthenticationUserCollection _users = null; 
    private FormsAuthPasswordFormat _passwordFormat; 

    public override void Initialize(string name, 
     System.Collections.Specialized.NameValueCollection config) 
    { 
     base.Initialize(name, config); 
     _passwordFormat = getPasswordFormat(); 
    } 

    public override bool ValidateUser(string username, string password) 
    { 
     var user = getUsers()[username]; 
     if (user == null) return false; 

     if (_passwordFormat == FormsAuthPasswordFormat.Clear) 
     { 
      if (user.Password == password) 
      { 
       return true; 
      } 
     } 
     else 
     { 
      if (user.Password == FormsAuthentication.HashPasswordForStoringInConfigFile(password, 
       _passwordFormat.ToString())) 
      { 
       return true; 
      } 
     } 

     return false; 
    } 

    protected FormsAuthenticationUserCollection getUsers() 
    { 
     if (_users == null) 
     { 
      AuthenticationSection section = getAuthenticationSection(); 
      FormsAuthenticationCredentials creds = section.Forms.Credentials; 
      _users = section.Forms.Credentials.Users; 
     } 
     return _users; 
    } 

    protected AuthenticationSection getAuthenticationSection() 
    { 
     Configuration config = WebConfigurationManager.OpenWebConfiguration("~"); 
     return (AuthenticationSection)config.GetSection("system.web/authentication"); 
    } 

    protected FormsAuthPasswordFormat getPasswordFormat() 
    { 
     return getAuthenticationSection().Forms.Credentials.PasswordFormat; 
    } 
} 
+1

Bạn đá anh chàng! – sbeskur

+0

Bạn được chào đón :-) – tomfanning

+0

Tôi sắp sử dụng phương thức không được chấp nhận FormsAuthentication.Authenticate. Cảm ơn bạn đã đặt lớp học ở đây. – strider

3

Bạn sẽ cần phải viết nhà cung cấp của riêng bạn cho việc này. Sẽ tương đối dễ dàng khi lấy mẫu ReadOnlyXmlMembershipProvider trong MSDN documentation và thay đổi nó để đọc người dùng và thông tin đăng nhập từ web.config, thay vì tệp XML bên ngoài.

2

Tôi không chắc chắn nếu bạn đã cố gắng nhưng ....

Các FormsAuthentication.Authenticate chịu trách nhiệm để làm điều đó cho bạn (mặc dù nó bị phản đối ngay bây giờ vì hành vi khuyến cáo là sử dụng các thành viên đối tượng)

Từ MSDN:

các Authenticate phương pháp xác minh thông tin người dùng được lưu trữ trong phần thông tin của tập tin cấu hình ứng dụng. Ngoài ra, bạn có thể sử dụng thành viên ASP.NET để lưu trữ thông tin xác thực người dùng và gọi ValidateUser để xác minh thông tin đăng nhập.

Bạn cũng có thể loại bỏ các nhà cung cấp thành viên (vì ngay cả khi bạn không khai báo chúng trên web.config của bạn, họ được thừa kế từ file machine.config)

<membership> 
    <providers> 
     <remove name="AspNetSqlMembershipProvider"/> 
    </providers> 
    </membership> 
Các vấn đề liên quan