一.配制Form认证
1.创建Web应用程序 运行iisreset /noforce
2.创建网站集
3.配制站点为Form认证 成员验证提供程序:AspNetSqlMembershipProvider 角色验证提供程序:AspNetSqlRoleProvider。
二.配制默认Membership
1.在站点的Config文件<system.web>节中加入以下代码。
<membership defaultProvider="AspNetSqlMembershipProvider">
<providers>
<remove name="AspNetSqlmembershipProvider" />
<add connectionStringName="AspNetSqlProvider"
passwordAttemptWindow="10"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Hashed"
description="Stores and retrieves membership data from the Microsoft SQL Server database"
name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider" />
</providers>
</membership>
<roleManager enabled="true" defaultProvider="AspNetSqlRoleProvider">
<providers>
<remove name="AspNetSqlRoleProvider" />
<add connectionStringName="AspNetSqlProvider"
applicationName="/"
description="Stores and retrieves roles data from the local Microsoft SQL Server database"
name="AspNetSqlRoleProvider"
type="System.Web.Security.SqlRoleProvider" />
</providers>
</roleManager>
2.在<system.web>上面加下以下内容
<connectionStrings>
<remove name="AspNetSqlProvider" />
<add name="AspNetSqlProvider"
connectionString="server=IFM-205/SQLEXPRESS;database=aspnetdb; Integrated Security=True" />
</connectionStrings>
3.把站点改成Form认证即可。
4.把管理中心的Config 也加上以上内容,但是在RoleManager节中,将defaultProvider="AspNetSqlRoleProvider"改成defaultProvider="AspNetWindowsTokenRoleProvider" OK。
三.配制自制MemberShip
1.在站点Config中加以下内容:
<membership defaultProvider="TextFileMembershipProvider">
<providers>
<add name="TextFileMembershipProvider" type="MOSSSecurity.TextFileMembershipProvider, MOSSSecurity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9aa04d3327900c65" filePath="C:/Inetpub/wwwroot/wss/VirtualDirectories/8585/User.txt" />
</providers>
</membership>
2.在管理中心的配制文件上也要做同样设置
注意:配制站点为Form认证 成员验证提供程序:TextFileMembershipProvider,角色验证提供程序:AspNetSqlRoleProvider。type节点中的MOSSSecurity.TextFileMembershipProvider是程序集的全命名,也就是说MOSSSecurity是程序集的命名空间,TextFileMembershipProvider是程序集的类名。逗号后面的MOSSSecurity,是程序集名称。PublicKeyToken=9aa04d3327900c65"是指程序集的强命名的KEY值。filePath是要找的文件名称及路径。
Version和Culture还没说呢? 生成代码强命名的Dll把它拖到GAC(C:/Windows/Assembly)中,看它的属性。就知道了。
以下是TextFileMembershipProvider类的代码。它完成功能是去Config中的filePath节指定的路径去找用户名和密码。
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.Security;
using System.IO;
using System.Collections.Specialized;
namespace MOSSSecurity
{
public class TextFileMembershipProvider : MembershipProvider
{
private String _sFilePath = "";
public String FilePath
{
get { return _sFilePath; }
}
private IDictionary<String, String> LoadAllUsers()
{
if (String.IsNullOrEmpty(this.FilePath))
{
throw new InvalidOperationException("FilePath is not set.");
}
Dictionary<String, String> result = new Dictionary<String, String>();
using (StreamReader reader = new StreamReader(this.FilePath))
{
while (true)
{
String sLine = reader.ReadLine();
if (sLine == null)
{
break;
}
if (sLine.Trim().Length == 0)
{
continue;
}
String[] line = sLine.Split(':');
result.Add(line[0], line[1]);
}
}
return result;
}
private void WriteAllUsers(IDictionary<String, String> users)
{
if (String.IsNullOrEmpty(this.FilePath))
{
throw new InvalidOperationException("FilePath is not set.");
}
using (StreamWriter writer = new StreamWriter(this.FilePath, false))
{
foreach (String userId in users.Keys)
{
writer.WriteLine(userId + ":" + users[userId]);
}
}
}
public override void Initialize(string name, NameValueCollection config)
{
base.Initialize(name, config);
_sFilePath = config["filePath"];
}
public override string ApplicationName
{
get
{
return "/";
}
set
{
}
}
public override bool ChangePassword(string username, string oldPassword, string newPassword)
{
return true;
}
public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)
{
return true;
}
public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status)
{
IDictionary<String, String> users = this.LoadAllUsers();
if (users.ContainsKey(username))
{
status = MembershipCreateStatus.DuplicateUserName;
return null;
}
users.Add(username, password);
this.WriteAllUsers(users);
status = MembershipCreateStatus.Success;
MembershipUser user = new MembershipUser(this.Name, username, username, email, passwordQuestion, "", isApproved, false, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now);
return user;
}
public override bool DeleteUser(string username, bool deleteAllRelatedData)
{
IDictionary<String, String> users = this.LoadAllUsers();
if (users.ContainsKey(username))
{
users.Remove(username);
this.WriteAllUsers(users);
return true;
}
else
{
return false;
}
}
public override bool EnablePasswordReset
{
get { return false; }
}
public override bool EnablePasswordRetrieval
{
get { return false; }
}
public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
{
totalRecords = 0;
return null;
}
public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
{
MembershipUserCollection result = new MembershipUserCollection();
IDictionary<String, String> users = this.LoadAllUsers();
foreach (String username in users.Keys)
{
if (username.StartsWith(usernameToMatch))
{
result.Add(this.GetUser(usernameToMatch, false));
}
}
totalRecords = users.Count;
return result;
}
public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
{
MembershipUserCollection result = new MembershipUserCollection();
IDictionary<String, String> users = this.LoadAllUsers();
foreach (String username in users.Keys)
{
result.Add(this.GetUser(username, false));
}
totalRecords = users.Count;
return result;
}
public override int GetNumberOfUsersOnline()
{
return 0;
}
public override string GetPassword(string username, string answer)
{
return "";
}
public override MembershipUser GetUser(string username, bool userIsOnline)
{
IDictionary<String, String> users = this.LoadAllUsers();
if (users.ContainsKey(username))
{
MembershipUser result = new MembershipUser(this.Name, username, username, "", "", "", true, false, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now);
return result;
}
else
{
return null;
}
}
public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
{
return this.GetUser(providerUserKey.ToString(), userIsOnline);
}
public override string GetUserNameByEmail(string email)
{
return "";
}
public override int MaxInvalidPasswordAttempts
{
get { return 999; }
}
public override int MinRequiredNonAlphanumericCharacters
{
get { return 0; }
}
public override int MinRequiredPasswordLength
{
get { return 1; }
}
public override int PasswordAttemptWindow
{
get { return 999; }
}
public override MembershipPasswordFormat PasswordFormat
{
get { return MembershipPasswordFormat.Clear; }
}
public override string PasswordStrengthRegularExpression
{
get { return ""; }
}
public override bool RequiresQuestionAndAnswer
{
get { return false; }
}
public override bool RequiresUniqueEmail
{
get { return false; }
}
public override string ResetPassword(string username, string answer)
{
return "";
}
public override bool UnlockUser(string userName)
{
return true;
}
public override void UpdateUser(MembershipUser user)
{
}
public override bool ValidateUser(string username, string password)
{
IDictionary<String, String> users = this.LoadAllUsers();
if (!users.ContainsKey(username))
{
return false;
}
if (users[username] != password)
{
return false;
}
return true;
}
}
}
User.txt内容
admin:password@1
xiao:xiaoep@1
说明:三部分是kaneboy提供的程序 谢谢