2009-08-17 3 views
0

В настоящее время я использую очень обычную реализацию MembershipProvider в веб-приложении ASP.NET. Поскольку мои требования к членству увеличиваются, кажется, имеет смысл использовать существующую полнофункциональную и хорошо протестированную реализацию, такую ​​как SqlMembershipProvider. Я выяснил, как использовать хранимые процедуры aspnet_Memebership для создания пользователей из моих пользовательских таблиц, но я застрял в пароле. Моя пользовательская реализация не использует соль, и SqlMembershipProvider, похоже, требует ее.Как перейти от пользовательского поставщика членства к SqlMembershipProvider?

Я хочу, чтобы это был плавный переход для моих пользователей и не требовал, чтобы каждый обновлял свой пароль при первом входе в систему после изменения.

Как перенести хешированные пароли из пользовательской реализации (см. Ниже) в SqlMemberhipProvider?

FormsAuthentication.HashPasswordForStoringInConfigFile(password, FormsAuthPasswordFormat.SHA1.ToString()) 

Update: Я должен пояснить, что мой пользовательский поставщик является реализация MembershipProvider, просто не полнофункциональным один. Кроме того, я попытался использовать aspnet _Membership _CreateUser с пустой солью, но хеши не совпадают.

+0

Лично я считаю Стандартной поставщика членства боль в заднице, и в основном полностью непригодным .. YMMV: P – Thorarin

+0

@Thorarin - Что Вам не нравится SqlMembershipProvider? – jrummell

+0

Я сдался через несколько дней, пытаясь перенести своих пользователей. Я просто собираюсь добавить недостающие функции в свой пользовательский провайдер. – jrummell

ответ

1

Вы можете написать собственный хэш-алгоритм, который удаляет соль (первые 16 байт комбинированной соли и пароля).

http://forums.asp.net/t/981295.aspx

В качестве альтернативы вы могли бы написать свой собственный класс, который наследует MembershipProvider, но это будет больше работы.

1

Лучше всего попытаться создать пользователей SqlMembership вручную (через хранимые процедуры) с помощью пустой соль.

Если это не сработает, я думаю, вы не повезло с SqlMembershipProvider, но вы всегда можете написать свой собственный MembershipProvider (возможно, даже основываясь на собственном заднем-конце SqlMembershipProvider «s). Это не так сложно.

+0

@Ruben - Вы и Axl оба заслуживают ответа, но Axl нуждается в репутации больше :) – jrummell

+0

Я могу жить с этим :-) – Ruben

0

Переопределите класс 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 
     */ 

    } 


} 
Смежные вопросы