Asp.net membership SqlMembershipProvider,其中IIS和SQL位于不同的计算机上?
我们正在将我的一个网站转移到生产中。由于防火墙以及网站和数据库位于不同的计算机上,网站无法直接连接到SQL server。我们已经设置好了它,所以我们通过WCF服务运行所有的数据库访问。所有这些都很好 然而,我发现问题在于AspNetSqlProvider。除了为您的网站设置外,我对提供商不太熟悉,但据我所知,您向提供商对象传递一个连接字符串,它会自动处理您网站的ASP.NET帐户。我不能在生产上有这个,但是,正如我所说的,网站和数据库不能互相看到,IIS和数据库的自动链接也不能工作 从主题来看,这不是一个原创概念/问题。不过,我已经研究了几天,没有发现任何有用的东西。我确实找到了一两篇文章,说明了如何创建新的继承MembershipProvider类并重写所有方法。不过,这是一项繁重的工作,我认为这是一个如此普遍的问题,我看不到解决办法 当IIS和数据库位于不同的计算机上时,如何设置AspNetSqlProvider?有没有办法通过wcf服务或其他对象运行AspNetSqlProvider,使其不直接连接到SQL serverAsp.net membership SqlMembershipProvider,其中IIS和SQL位于不同的计算机上?,asp.net-membership,membership,sqlmembershipprovider,Asp.net Membership,Membership,Sqlmembershipprovider,我们正在将我的一个网站转移到生产中。由于防火墙以及网站和数据库位于不同的计算机上,网站无法直接连接到SQL server。我们已经设置好了它,所以我们通过WCF服务运行所有的数据库访问。所有这些都很好 然而,我发现问题在于AspNetSqlProvider。除了为您的网站设置外,我对提供商不太熟悉,但据我所知,您向提供商对象传递一个连接字符串,它会自动处理您网站的ASP.NET帐户。我不能在生产上有这个,但是,正如我所说的,网站和数据库不能互相看到,IIS和数据库的自动链接也不能工作 从主题来看
提前谢谢 您可以围绕此服务包装自定义成员资格提供程序。要记住的是保护端点!保护端点
// <copyright project="Salient.ScriptModel" file="MembershipService.svc" company="Sky Sanders">
// http://skysanders.net/subtext
// Attribution is appreciated
// </copyright>
// <version>1.0</version>
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.Web.Security;
namespace Salient.ScriptModel
{
[ServiceContract(Namespace = "Salient.ScriptModel", Name = "MembershipProvider")]
public interface IMembershipProvider
{
string ProviderName { get; set; }
[OperationContract]
DateTime TestInput(DateTime date);
[OperationContract]
ProviderProperties GetProviderProperties();
[OperationContract]
MembershipUser GetUserByKey(object providerUserKey, bool userIsOnline);
[OperationContract]
MembershipCreateResult CreateUser(string username, string password,
string email, string passwordQuestion,
string passwordAnswer, bool isApproved,
object providerUserKey);
[OperationContract]
MembershipCreateResult AddUser(MembershipUser user);
[OperationContract]
bool ChangePasswordQuestionAndAnswer(string username, string password,
string newPasswordQuestion, string newPasswordAnswer);
[OperationContract]
string GetPassword(string username, string answer);
[OperationContract]
bool ChangePassword(string username, string oldPassword, string newPassword);
[OperationContract]
string ResetPassword(string username, string answer);
[OperationContract]
void UpdateUser(MembershipUser user);
[OperationContract]
bool ValidateUser(string username, string password);
[OperationContract]
bool UnlockUser(string userName);
[OperationContract]
MembershipUser GetUserByName(string username, bool userIsOnline);
[OperationContract]
string GetUserNameByEmail(string email);
[OperationContract]
bool DeleteUser(string username, bool deleteAllRelatedData);
[OperationContract]
MembershipFindResult GetAllUsers(int pageIndex, int pageSize);
[OperationContract]
int GetNumberOfUsersOnline();
[OperationContract]
MembershipFindResult FindUsersByName(string usernameToMatch, int pageIndex,
int pageSize);
[OperationContract]
MembershipFindResult FindUsersByEmail(string emailToMatch, int pageIndex,
int pageSize);
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class MembershipProvider : IMembershipProvider
{
private System.Web.Security.MembershipProvider Provider
{
get
{
if (string.IsNullOrEmpty(ProviderName))
{
return Membership.Provider;
}
return Membership.Providers[ProviderName];
}
}
#region IMembershipProvider Members
public DateTime TestInput(DateTime date)
{
return date;
}
public string ProviderName { get; set; }
public ProviderProperties GetProviderProperties()
{
var returnValue = new ProviderProperties
{
ApplicationName = Provider.ApplicationName,
EnablePasswordReset = Provider.EnablePasswordReset,
EnablePasswordRetrieval = Provider.EnablePasswordRetrieval,
MaxInvalidPasswordAttempts = Provider.MaxInvalidPasswordAttempts,
MinRequiredNonAlphanumericCharacters =
Provider.MinRequiredNonAlphanumericCharacters,
MinRequiredPasswordLength = Provider.MinRequiredPasswordLength,
PasswordAttemptWindow = Provider.PasswordAttemptWindow,
PasswordFormat = Provider.PasswordFormat,
PasswordStrengthRegularExpression = Provider.PasswordStrengthRegularExpression,
RequiresQuestionAndAnswer = Provider.RequiresQuestionAndAnswer,
RequiresUniqueEmail = Provider.RequiresUniqueEmail
};
return returnValue;
}
public MembershipUser GetUserByKey(object providerUserKey, bool userIsOnline)
{
return Provider.GetUser(providerUserKey, userIsOnline);
}
public MembershipCreateResult CreateUser(string username, string password,
string email, string passwordQuestion,
string passwordAnswer, bool isApproved,
object providerUserKey)
{
MembershipCreateStatus status;
MembershipUser user = Provider.CreateUser(username, password, email, passwordQuestion, passwordAnswer,
isApproved,
providerUserKey, out status);
return new MembershipCreateResult(user, status);
}
public MembershipCreateResult AddUser(MembershipUser user)
{
return new MembershipCreateResult(user, MembershipCreateStatus.DuplicateEmail);
}
public bool ChangePasswordQuestionAndAnswer(string username, string password,
string newPasswordQuestion, string newPasswordAnswer)
{
return Provider.ChangePasswordQuestionAndAnswer(username, password, newPasswordQuestion, newPasswordAnswer);
}
public string GetPassword(string username, string answer)
{
return Provider.GetPassword(username, answer);
}
public bool ChangePassword(string username, string oldPassword, string newPassword)
{
return Provider.ChangePassword(username, oldPassword, newPassword);
}
public string ResetPassword(string username, string answer)
{
return Provider.ResetPassword(username, answer);
}
public void UpdateUser(MembershipUser user)
{
Provider.UpdateUser(user);
}
public bool ValidateUser(string username, string password)
{
return Provider.ValidateUser(username, password);
}
public bool UnlockUser(string userName)
{
return Provider.UnlockUser(userName);
}
public MembershipUser GetUserByName(string username, bool userIsOnline)
{
return Provider.GetUser(username, userIsOnline);
}
public string GetUserNameByEmail(string email)
{
return Provider.GetUserNameByEmail(email);
}
public bool DeleteUser(string username, bool deleteAllRelatedData)
{
return Provider.DeleteUser(username, deleteAllRelatedData);
}
public MembershipFindResult GetAllUsers(int pageIndex, int pageSize)
{
int totalRecords;
MembershipUserCollection users = Provider.GetAllUsers(pageIndex, pageSize, out totalRecords);
var list = new List<MembershipUser>();
foreach (MembershipUser user in users)
{
list.Add(user);
}
return new MembershipFindResult(list, totalRecords);
}
public int GetNumberOfUsersOnline()
{
return Provider.GetNumberOfUsersOnline();
}
public MembershipFindResult FindUsersByName(string usernameToMatch, int pageIndex,
int pageSize)
{
int totalRecords;
MembershipUserCollection users = Provider.FindUsersByName(usernameToMatch, pageIndex, pageSize,
out totalRecords);
var list = new List<MembershipUser>();
foreach (MembershipUser user in users)
{
list.Add(user);
}
return new MembershipFindResult(list, totalRecords);
}
public MembershipFindResult FindUsersByEmail(string emailToMatch, int pageIndex,
int pageSize)
{
int totalRecords;
MembershipUserCollection users = Provider.FindUsersByEmail(emailToMatch, pageIndex, pageSize,
out totalRecords);
var list = new List<MembershipUser>();
foreach (MembershipUser user in users)
{
list.Add(user);
}
return new MembershipFindResult(list, totalRecords);
}
#endregion
}
[DataContract]
public class MembershipFindResult
{
[DataMember] public int RecordCount;
[DataMember] public IEnumerable<MembershipUser> Users;
public MembershipFindResult()
{
}
public MembershipFindResult(IEnumerable<MembershipUser> users, int recordCount)
{
Users = users;
RecordCount = recordCount;
}
}
[DataContract]
public class MembershipCreateResult
{
[DataMember] public MembershipCreateStatus CreateStatus;
[DataMember] public MembershipUser User;
public MembershipCreateResult()
{
}
public MembershipCreateResult(MembershipUser user, MembershipCreateStatus createStatus)
{
User = user;
CreateStatus = createStatus;
}
}
[DataContract]
public class ProviderProperties
{
public ProviderProperties()
{
}
public ProviderProperties(bool enablePasswordRetrieval, bool enablePasswordReset, bool requiresQuestionAndAnswer,
int maxInvalidPasswordAttempts,
int passwordAttemptWindow, bool requiresUniqueEmail,
MembershipPasswordFormat passwordFormat, int minRequiredPasswordLength,
int minRequiredNonAlphanumericCharacters,
string passwordStrengthRegularExpression, string applicationName)
{
EnablePasswordRetrieval = enablePasswordRetrieval;
EnablePasswordReset = enablePasswordReset;
RequiresQuestionAndAnswer = requiresQuestionAndAnswer;
MaxInvalidPasswordAttempts = maxInvalidPasswordAttempts;
PasswordAttemptWindow = passwordAttemptWindow;
RequiresUniqueEmail = requiresUniqueEmail;
PasswordFormat = passwordFormat;
MinRequiredPasswordLength = minRequiredPasswordLength;
MinRequiredNonAlphanumericCharacters = minRequiredNonAlphanumericCharacters;
PasswordStrengthRegularExpression = passwordStrengthRegularExpression;
ApplicationName = applicationName;
}
[DataMember]
public bool EnablePasswordRetrieval { get; set; }
[DataMember]
public bool EnablePasswordReset { get; set; }
[DataMember]
public bool RequiresQuestionAndAnswer { get; set; }
[DataMember]
public int MaxInvalidPasswordAttempts { get; set; }
[DataMember]
public int PasswordAttemptWindow { get; set; }
[DataMember]
public bool RequiresUniqueEmail { get; set; }
[DataMember]
public MembershipPasswordFormat PasswordFormat { get; set; }
[DataMember]
public int MinRequiredPasswordLength { get; set; }
[DataMember]
public int MinRequiredNonAlphanumericCharacters { get; set; }
[DataMember]
public string PasswordStrengthRegularExpression { get; set; }
[DataMember]
public string ApplicationName { get; set; }
}
}
使用证书或AD或任何和SSL通过网络传递用户凭据
我并没有测试这个类中的每个方法,但以前的实现执行得很好,所以最终它可能会让您到达需要去的地方
保护端点
// <copyright project="Salient.ScriptModel" file="MembershipService.svc" company="Sky Sanders">
// http://skysanders.net/subtext
// Attribution is appreciated
// </copyright>
// <version>1.0</version>
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.Web.Security;
namespace Salient.ScriptModel
{
[ServiceContract(Namespace = "Salient.ScriptModel", Name = "MembershipProvider")]
public interface IMembershipProvider
{
string ProviderName { get; set; }
[OperationContract]
DateTime TestInput(DateTime date);
[OperationContract]
ProviderProperties GetProviderProperties();
[OperationContract]
MembershipUser GetUserByKey(object providerUserKey, bool userIsOnline);
[OperationContract]
MembershipCreateResult CreateUser(string username, string password,
string email, string passwordQuestion,
string passwordAnswer, bool isApproved,
object providerUserKey);
[OperationContract]
MembershipCreateResult AddUser(MembershipUser user);
[OperationContract]
bool ChangePasswordQuestionAndAnswer(string username, string password,
string newPasswordQuestion, string newPasswordAnswer);
[OperationContract]
string GetPassword(string username, string answer);
[OperationContract]
bool ChangePassword(string username, string oldPassword, string newPassword);
[OperationContract]
string ResetPassword(string username, string answer);
[OperationContract]
void UpdateUser(MembershipUser user);
[OperationContract]
bool ValidateUser(string username, string password);
[OperationContract]
bool UnlockUser(string userName);
[OperationContract]
MembershipUser GetUserByName(string username, bool userIsOnline);
[OperationContract]
string GetUserNameByEmail(string email);
[OperationContract]
bool DeleteUser(string username, bool deleteAllRelatedData);
[OperationContract]
MembershipFindResult GetAllUsers(int pageIndex, int pageSize);
[OperationContract]
int GetNumberOfUsersOnline();
[OperationContract]
MembershipFindResult FindUsersByName(string usernameToMatch, int pageIndex,
int pageSize);
[OperationContract]
MembershipFindResult FindUsersByEmail(string emailToMatch, int pageIndex,
int pageSize);
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class MembershipProvider : IMembershipProvider
{
private System.Web.Security.MembershipProvider Provider
{
get
{
if (string.IsNullOrEmpty(ProviderName))
{
return Membership.Provider;
}
return Membership.Providers[ProviderName];
}
}
#region IMembershipProvider Members
public DateTime TestInput(DateTime date)
{
return date;
}
public string ProviderName { get; set; }
public ProviderProperties GetProviderProperties()
{
var returnValue = new ProviderProperties
{
ApplicationName = Provider.ApplicationName,
EnablePasswordReset = Provider.EnablePasswordReset,
EnablePasswordRetrieval = Provider.EnablePasswordRetrieval,
MaxInvalidPasswordAttempts = Provider.MaxInvalidPasswordAttempts,
MinRequiredNonAlphanumericCharacters =
Provider.MinRequiredNonAlphanumericCharacters,
MinRequiredPasswordLength = Provider.MinRequiredPasswordLength,
PasswordAttemptWindow = Provider.PasswordAttemptWindow,
PasswordFormat = Provider.PasswordFormat,
PasswordStrengthRegularExpression = Provider.PasswordStrengthRegularExpression,
RequiresQuestionAndAnswer = Provider.RequiresQuestionAndAnswer,
RequiresUniqueEmail = Provider.RequiresUniqueEmail
};
return returnValue;
}
public MembershipUser GetUserByKey(object providerUserKey, bool userIsOnline)
{
return Provider.GetUser(providerUserKey, userIsOnline);
}
public MembershipCreateResult CreateUser(string username, string password,
string email, string passwordQuestion,
string passwordAnswer, bool isApproved,
object providerUserKey)
{
MembershipCreateStatus status;
MembershipUser user = Provider.CreateUser(username, password, email, passwordQuestion, passwordAnswer,
isApproved,
providerUserKey, out status);
return new MembershipCreateResult(user, status);
}
public MembershipCreateResult AddUser(MembershipUser user)
{
return new MembershipCreateResult(user, MembershipCreateStatus.DuplicateEmail);
}
public bool ChangePasswordQuestionAndAnswer(string username, string password,
string newPasswordQuestion, string newPasswordAnswer)
{
return Provider.ChangePasswordQuestionAndAnswer(username, password, newPasswordQuestion, newPasswordAnswer);
}
public string GetPassword(string username, string answer)
{
return Provider.GetPassword(username, answer);
}
public bool ChangePassword(string username, string oldPassword, string newPassword)
{
return Provider.ChangePassword(username, oldPassword, newPassword);
}
public string ResetPassword(string username, string answer)
{
return Provider.ResetPassword(username, answer);
}
public void UpdateUser(MembershipUser user)
{
Provider.UpdateUser(user);
}
public bool ValidateUser(string username, string password)
{
return Provider.ValidateUser(username, password);
}
public bool UnlockUser(string userName)
{
return Provider.UnlockUser(userName);
}
public MembershipUser GetUserByName(string username, bool userIsOnline)
{
return Provider.GetUser(username, userIsOnline);
}
public string GetUserNameByEmail(string email)
{
return Provider.GetUserNameByEmail(email);
}
public bool DeleteUser(string username, bool deleteAllRelatedData)
{
return Provider.DeleteUser(username, deleteAllRelatedData);
}
public MembershipFindResult GetAllUsers(int pageIndex, int pageSize)
{
int totalRecords;
MembershipUserCollection users = Provider.GetAllUsers(pageIndex, pageSize, out totalRecords);
var list = new List<MembershipUser>();
foreach (MembershipUser user in users)
{
list.Add(user);
}
return new MembershipFindResult(list, totalRecords);
}
public int GetNumberOfUsersOnline()
{
return Provider.GetNumberOfUsersOnline();
}
public MembershipFindResult FindUsersByName(string usernameToMatch, int pageIndex,
int pageSize)
{
int totalRecords;
MembershipUserCollection users = Provider.FindUsersByName(usernameToMatch, pageIndex, pageSize,
out totalRecords);
var list = new List<MembershipUser>();
foreach (MembershipUser user in users)
{
list.Add(user);
}
return new MembershipFindResult(list, totalRecords);
}
public MembershipFindResult FindUsersByEmail(string emailToMatch, int pageIndex,
int pageSize)
{
int totalRecords;
MembershipUserCollection users = Provider.FindUsersByEmail(emailToMatch, pageIndex, pageSize,
out totalRecords);
var list = new List<MembershipUser>();
foreach (MembershipUser user in users)
{
list.Add(user);
}
return new MembershipFindResult(list, totalRecords);
}
#endregion
}
[DataContract]
public class MembershipFindResult
{
[DataMember] public int RecordCount;
[DataMember] public IEnumerable<MembershipUser> Users;
public MembershipFindResult()
{
}
public MembershipFindResult(IEnumerable<MembershipUser> users, int recordCount)
{
Users = users;
RecordCount = recordCount;
}
}
[DataContract]
public class MembershipCreateResult
{
[DataMember] public MembershipCreateStatus CreateStatus;
[DataMember] public MembershipUser User;
public MembershipCreateResult()
{
}
public MembershipCreateResult(MembershipUser user, MembershipCreateStatus createStatus)
{
User = user;
CreateStatus = createStatus;
}
}
[DataContract]
public class ProviderProperties
{
public ProviderProperties()
{
}
public ProviderProperties(bool enablePasswordRetrieval, bool enablePasswordReset, bool requiresQuestionAndAnswer,
int maxInvalidPasswordAttempts,
int passwordAttemptWindow, bool requiresUniqueEmail,
MembershipPasswordFormat passwordFormat, int minRequiredPasswordLength,
int minRequiredNonAlphanumericCharacters,
string passwordStrengthRegularExpression, string applicationName)
{
EnablePasswordRetrieval = enablePasswordRetrieval;
EnablePasswordReset = enablePasswordReset;
RequiresQuestionAndAnswer = requiresQuestionAndAnswer;
MaxInvalidPasswordAttempts = maxInvalidPasswordAttempts;
PasswordAttemptWindow = passwordAttemptWindow;
RequiresUniqueEmail = requiresUniqueEmail;
PasswordFormat = passwordFormat;
MinRequiredPasswordLength = minRequiredPasswordLength;
MinRequiredNonAlphanumericCharacters = minRequiredNonAlphanumericCharacters;
PasswordStrengthRegularExpression = passwordStrengthRegularExpression;
ApplicationName = applicationName;
}
[DataMember]
public bool EnablePasswordRetrieval { get; set; }
[DataMember]
public bool EnablePasswordReset { get; set; }
[DataMember]
public bool RequiresQuestionAndAnswer { get; set; }
[DataMember]
public int MaxInvalidPasswordAttempts { get; set; }
[DataMember]
public int PasswordAttemptWindow { get; set; }
[DataMember]
public bool RequiresUniqueEmail { get; set; }
[DataMember]
public MembershipPasswordFormat PasswordFormat { get; set; }
[DataMember]
public int MinRequiredPasswordLength { get; set; }
[DataMember]
public int MinRequiredNonAlphanumericCharacters { get; set; }
[DataMember]
public string PasswordStrengthRegularExpression { get; set; }
[DataMember]
public string ApplicationName { get; set; }
}
}
//
// http://skysanders.net/subtext
//感谢归因
//
// 1.0
使用制度;
使用System.Collections.Generic;
使用System.Runtime.Serialization;
使用System.ServiceModel;
使用System.ServiceModel.Activation;
使用System.Web.Security;
namespace.ScriptModel
{
[ServiceContract(Namespace=“excellent.ScriptModel”,Name=“MembershipProvider”)]
公共接口IMembershipProvider
{
字符串提供程序名{get;set;}
[经营合同]
日期时间测试输入(日期时间日期);
[经营合同]
ProviderProperties GetProviderProperties();
[经营合同]
MembershipUser GetUserByKey(对象提供者UserKey,bool userIsOnline);
[经营合同]
MembershipCreateResult CreateUser(字符串用户名、字符串密码、,
字符串电子邮件,字符串密码问题,
字符串密码应答,布尔被批准,
对象提供者(用户密钥);
[经营合同]
MembershipCreateResult-AddUser(MembershipUser用户);
[经营合同]
bool ChangePasswordQuestionAndAnswer(字符串用户名、字符串密码、,
字符串newPasswordQuestion,字符串newPasswordAnswer);
[经营合同]
字符串GetPassword(字符串用户名、字符串答案);
[经营合同]
bool ChangePassword(字符串用户名、字符串旧密码、字符串新密码);
[经营合同]
字符串重置密码(字符串用户名、字符串答案);
[经营合同]
void UpdateUser(成员身份用户);
[经营合同]
bool ValidateUser(字符串用户名、字符串密码);
[经营合同]
bool UnlockUser(字符串用户名);
[经营合同]
MembershipUserGetUserByName(字符串用户名,boolUserIsOnline);
[经营合同]
字符串getUsernameBayEmail(字符串电子邮件);
[经营合同]
bool DeleteUser(字符串用户名,bool deleteAllRelatedData);
[经营合同]
MembershipFindResult GetAllUsers(int-pageIndex,int-pageSize);
[经营合同]
int GetNumberOfUsersOnline();
[经营合同]
MembershipFindResult FindUserByName(字符串用户名匹配,int-pageIndex,
int pageSize);
[经营合同]
MembershipFindResult FindUsersByEmail(字符串emailToMatch,int-pageIndex,
int pageSize);
}
[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]
公共类成员身份提供程序:IMembershipProvider
{
private System.Web.Security.MembershipProvider提供程序
{
得到
{
if(string.IsNullOrEmpty(ProviderName))
{
返回成员资格。提供程序;
}
返回成员资格。提供程序[ProviderName];
}
}
#区域IMembershipProvider成员
公共日期时间测试输入(日期时间日期)
{
返回日期;
}
公共字符串提供程序名称{get;set;}
公共ProviderProperties GetProviderProperties()
{
var returnValue=新ProviderProperties
{
ApplicationName=Provider.ApplicationName,
EnablePasswordReset=Provider.EnablePasswordReset,
EnablePasswordRetrieval=Provider.EnablePasswordRetrieval,
MaxInvalidPasswordAttempts=Provider.MaxInvalidPasswordAttempts,
最小必需非字母数字字符=
Provider.MinRequiredNonalphanumeric字符,