Как перейти с пользовательского поставщика членства на 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
        */

    }


}
Другие вопросы по тегам