Poniższy przykładowy kod języka C# pokazuje, jak configure a .NET membership provider programmatically przez Jacques L. Chereau. Ten kod wymaga również configure a connection string nazwie MyDatabase
NameValueCollection objConfig = new NameValueCollection();
objConfig.Add("connectionStringName", "MyDatabase");
objConfig.Add("enablePasswordRetrieval", "false");
objConfig.Add("enablePasswordReset", "true");
objConfig.Add("requiresQuestionAndAnswer", "true");
objConfig.Add("applicationName", "MyApp");
objConfig.Add("requiresUniqueEmail", "true");
objConfig.Add("maxInvalidPasswordAttempts", "5");
objConfig.Add("passwordAttemptWindow", "10");
objConfig.Add("commandTimeout", "30");
objConfig.Add("passwordFormat", "Hashed");
objConfig.Add("name", "AspNetSqlMembershipProvider");
objConfig.Add("minRequiredPasswordLength", "8");
objConfig.Add("minRequiredNonalphanumericCharacters", "2");
objConfig.Add("passwordStrengthRegularExpression", "(?=^.{8,25}$)(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[[email protected]#$%^&*()_+}{\\":;'?/>.<,])(?!.*\\s).*$"));
SqlMembershipProvider objSqlMembershipProvider = new SqlMembershipProvider();
objSqlMembershipProvider.Initialize(objConfig["name"], objConfig);
MembershipProviderCollection colMembershipProviders = new MembershipProviderCollection();
colMembershipProviders.Add(objSqlMembershipProvider);
colMembershipProviders.SetReadOnly();
BindingFlags enuBindingFlags = BindingFlags.NonPublic | BindingFlags.Static;
Type objMembershipType = typeof(Membership);
objMembershipType.GetField("s_Initialized", enuBindingFlags).SetValue(null, true);
objMembershipType.GetField("s_InitializeException", enuBindingFlags).SetValue(null, null);
objMembershipType.GetField("s_HashAlgorithmType", enuBindingFlags).SetValue(null, "SHA1");
objMembershipType.GetField("s_HashAlgorithmFromConfig", enuBindingFlags).SetValue(null, false);
objMembershipType.GetField("s_UserIsOnlineTimeWindow", enuBindingFlags).SetValue(null, 15);
objMembershipType.GetField("s_Provider", enuBindingFlags).SetValue(null, objSqlMembershipProvider);
objMembershipType.GetField("s_Providers", enuBindingFlags).SetValue(null, colMembershipProviders);
Zakładając, że mamy następujące odniesienia Biblioteka:
using System.Web.Security;
using System.Collections.Specialized;
using System.Reflection;
EDIT:
Ta metoda ustawia ciąg połączenia w dostawców członkostwa wcześnie Wystarczająco dużo w cyklu życiowym żądania
private void SetMembershipProviderConnectionString(string connectionString)
{
// Set private property of Membership. Untested code!!
var connectionStringField = Membership.Provider.GetType().GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);
if (connectionStringField != null)
connectionStringField.SetValue(Membership.Provider, connectionString);
}
Nie testowano, ale wywołanie tej metody z Global.asax.cs wewnątrz Application_PreRequestHandlerExecute
wykonuje zadanie.
Ale jak ustawić ciąg połączenia? Muszę odwołać się do ciągu połączenia z kodu nie w web.config, to znaczy, że potrzebuję członkostwa, aby odczytać ciąg połączenia z kodu nie z pliku web.config. Więc z Twojego kodu nie mogę znaleźć, w jaki sposób ciąg połączenia jest obsługiwany przez członkostwo? Nie muszę pisać ciągu połączenia w web.config – Ahmy
Edytowałem swoją odpowiedź, aby uwzględnić metodę – chridam
. Dziękuję za dużo, że działa poprawnie, ponieważ pragnąłem ponownie. – Ahmy