Как перейти с пользовательского поставщика членства на SqlMembershipProvider?
В настоящее время я использую очень простую пользовательскую реализацию MembershipProvider в веб-приложении ASP.NET. Поскольку мои требования к членству увеличиваются, кажется, имеет смысл использовать существующую, полнофункциональную и хорошо протестированную реализацию, такую как SqlMembershipProvider. Я выяснил, как использовать хранимые процедуры aspnet_Memebership для создания пользователей из моих пользовательских таблиц, но я застрял в пароле. Моя пользовательская реализация не использует соль, и SqlMembershipProvider, кажется, требует этого.
Я хочу, чтобы это было плавным переходом для моих пользователей и не требовало, чтобы все обновляли свой пароль при первом входе в систему после изменения.
Как перенести хешированные пароли из пользовательской реализации (см. Ниже) в SqlMemberhipProvider?
FormsAuthentication.HashPasswordForStoringInConfigFile(password, FormsAuthPasswordFormat.SHA1.ToString())
Обновление: я должен уточнить, что мой пользовательский поставщик является реализацией MembershipProvider, а не полнофункциональной. Также я попытался использовать aspnet_Membership
_CreateUser с пустой солью, но хэши не совпадают.
3 ответа
Вы можете написать собственный алгоритм хеширования, который удаляет соль (первые 16 байтов объединенной соли и пароля).
http://forums.asp.net/t/981295.aspx
В качестве альтернативы вы могли бы написать свой собственный класс, который наследует MembershipProvider, но это будет больше работы.
Лучше всего попытаться создать SqlMembership
Пользователи вручную (через хранимые процедуры) с пустой солью.
Если это не сработает, я думаю, вам не повезло с SqlMembershipProvider
, но вы всегда можете написать свой MembershipProvider
(возможно, даже на основе SqlMembershipProvider
Бэкэнд). Это не так сложно.
Переопределите класс System.Web.Security.SqlMembershipProvider и переопределите столько методов, сколько вам нужно настроить.
web.config здесь не видно. но тот факт, что у вас есть свой собственный, работающий в первую очередь, я не думаю, что это является отправной точкой.
public class SqlMembershipProviderOverride : System.Web.Security.SqlMembershipProvider
{
public static readonly string FORCED_OVERRIDE_APPLICATION_NAME = "MyApplicationName";
public SqlMembershipProviderOverride()
{
this.ApplicationName = FORCED_OVERRIDE_APPLICATION_NAME;
}
public override System.Web.Security.MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out System.Web.Security.MembershipCreateStatus status)
{
return base.CreateUser(username, password, email, passwordQuestion, passwordAnswer, isApproved, providerUserKey, out status);
/*
Do "your own thing" in this or any other override method
*/
}
}