Как я могу настроить поставщиков членства ASP.Net через код? - PullRequest
6 голосов
/ 22 июня 2009

Мы используем поставщиков членства ASP.Net (поставщик SQL Server), и я хочу иметь возможность настроить учетную запись администратора в качестве части нашего установщика. Для этого мне нужно, чтобы поставщик членства ASP.Net был настроен так, чтобы мой установщик мог его использовать, но мне не нужно настраивать файл конфигурации для установщика.

Так есть ли способ настроить членство в ASP.Net с помощью кода без написания собственного провайдера?

Ответы [ 2 ]

7 голосов
/ 16 сентября 2009

Хорошо, следуя решению, которое они создали здесь: http://forums.asp.net/p/997608/2209437.aspx

Я создал класс, который в конструкторе без параметров (который вам нужен) просто получает сервер и порт из аргументов командной строки. Такой, что я могу перейти "MembershipInitializer.exe" SomeSqlServer \ Instance "51000.

public class CustomSQLMembershipProvider : SqlMembershipProvider {
  private readonly string _server;
  private readonly string _port;

  /// <summary>
  /// Initializes a new instance of the <see cref="T:System.Web.Security.SqlMembershipProvider"/> class.
  /// </summary>
  public CustomSQLMembershipProvider() {
    string[] args = System.Environment.GetCommandLineArgs();
    // args[0] is the exe name
    _server = args[1];
    _port = args[2];
  }

  public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
  {
    base.Initialize(name, config);

    // Update the private connection string field in the base class.
    string connectionString = string.Format(@"Data Source={0},{1};Initial Catalog=aspnetdb;UID=NICCAMembership;PWD=_Password1;Application Name=NICCA;Connect Timeout=120;", _server, _port);

    // Set private property of Membership provider.
    FieldInfo connectionStringField = GetType().BaseType.GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);
    connectionStringField.SetValue(this, connectionString);
  }
}

В app.config вашего консольного приложения (или приложения Windows)

<configuration>
 <connectionStrings>
  <clear/>
  <add name="MembershipDB"
    connectionString="Some Bogus String here that gets overrided in the custom class" 
    providerName="System.Data.SqlClient"/>
 </connectionStrings>
 <system.web>
  <authentication mode="Forms"/>
  <authorization>
   <deny users="?"/>
  </authorization>
  <membership>
   <providers>
    <remove name="AspNetSqlMembershipProvider"/>
    <add name="AspNetSqlMembershipProvider" 
      connectionStringName="MembershipDB" 
      applicationName="NICCA" 
      type="MyInitializeMembershipDB.CustomSQLMembershipProvider, MyInitializeMembershipDB" 
      requiresUniqueEmail="false" 
      requiresQuestionAndAnswer="false"/>
   </providers>
  </membership>
 </system.web>
</configuration>

Если вам также необходим бит поставщика ролей, вам, вероятно, придется переопределить SqlRoleProvider почти таким же образом.

Если вы создаете программу для автоматической инициализации базы данных вашего членства в определенном состоянии на основе, но адрес сервера sql и имя порта не известны, пока кто-то не введет их в мастер установки, это поможет ...

Помогает ли это?

0 голосов
/ 22 июня 2009

Membership.ApplicationName = "yourfbaApplicationame"; MembershipUser user = Membership.CreateUser("admin,"password","emaiol@g.com");

и убедитесь, что у вас есть следующие записи в файле конфигурации.

 <connectionStrings>
<add connectionString="server=sqd01-1-cll;database=FBA;Integrated Security=SSPI;"  name="FBASqlConnString" providerName="System.Data.SqlClient"/>

Если вы все еще хотите использовать полный код и вам не нужно использовать файл конфигурации. Используйте ниже

SqlMembershipProvider ObjSqlMembershipProvider = new SqlMembershipProvider();
            SqlRoleProvider ObjSqlRoleProvider = new SqlRoleProvider();
            NameValueCollection ObjNameValueCollRole = new NameValueCollection();
            NameValueCollection ObjNameValueCollMembership = new NameValueCollection();
            MembershipCreateStatus enMembershipCreateStatus;

                ObjNameValueCollMembership.Add("connectionStringName", "Connection String Name");
                ObjNameValueCollMembership.Add("applicationName", "ApplicatioNAme");

                //these items are assumed to be Default and dont care..Should be given a look later stage.
                ObjNameValueCollMembership.Add("enablePasswordRetrieval", "false");
                ObjNameValueCollMembership.Add("enablePasswordReset", "false");
                ObjNameValueCollMembership.Add("requiresQuestionAndAnswer", "false");
                ObjNameValueCollMembership.Add("requiresUniqueEmail", "false");
                ObjNameValueCollMembership.Add("passwordFormat", "Hashed");
                ObjNameValueCollMembership.Add("maxInvalidPasswordAttempts", "5");
                ObjNameValueCollMembership.Add("minRequiredPasswordLength", "1");
                ObjNameValueCollMembership.Add("minRequiredNonalphanumericCharacters", "0");
                ObjNameValueCollMembership.Add("passwordAttemptWindow", "10");
                ObjNameValueCollMembership.Add("passwordStrengthRegularExpression", "");

                //hard coded the Provider Name,This function just need one that is present. I tried other names and it throws error. I found this using Reflector ..all the rest are take care by the above
                //name value pairs
                ObjSqlMembershipProvider.Initialize("AspNetSqlMembershipProvider", ObjNameValueCollMembership);MembershipUser user = ObjSqlMembershipProvider.CreateUser("admin,"password","emaiol@g.com");         

One this Вам нужно указать строку подключения в файле конфигурации, иным способом не будет. Если вы хотите, чтобы это тоже было из кода, вам нужно наследовать класс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...