2009-06-22 2 views
6

우리는 ASP.Net 멤버십 공급자 (SQL Server 공급자)를 사용하고 있으며 설치 관리자의 일부로 관리 사용자 계정을 설정할 수 있기를 원합니다. 이렇게하려면 설치 관리자가 사용할 수 있도록 ASP.Net 멤버 자격 공급자를 구성해야합니다.하지만 설치 관리자를 위해 구성 파일을 설정하지 않으려합니다.코드를 통해 ASP.Net 멤버십 공급자를 구성하려면 어떻게합니까?

사용자 지정 공급자를 작성하지 않고 코드를 통해 ASP.Net 멤버십을 구성하는 방법이 있습니까?

답변

7

가 좋아, 해결책 다음 그들이 여기 연상 클래스 상속해야합니다

http://forums.asp.net/p/997608/2209437.aspx 내가 (당신이 필요로하는) ​​매개 변수가없는 생성자, 클래스를 생성에게 그냥 명령 줄 인수에서 서버와 포트를 가져옵니다. 그런 당신이 필요로하는 경우에 나는 "MembershipInitializer.exe"SomeSqlServer \ 인스턴스 "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 Server 주소 및 포트 이름이 ' 누군가가 안으로 들어갈 때까지 알려지지 않은 마구잡이 마법사,이 트릭을 할 것입니다 ..

이 도움이 되나요?

+0

결국 나는 결국 도착했습니다. –

+0

실제로이 필드를 설정하는 간단한 방법이 있습니다. juste write config [ "connectionString"] = yourConnectionString; before base.Initialize (name, config); 호출하면 끝났습니다!) – jpatte

-1

Membership.ApplicationName = "yourfbaApplicationame"; MembershipUser user = Membership.CreateUser("admin,"password","[email protected]");

하고 config 파일에 다음 항목이 있는지 확인합니다. 여전히 설정 파일을 사용하는 데 필요한 전체 코드를 사용 해달라고하고 싶다면

<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","[email protected]");   

이 하나 구성 파일에 연결 문자열을 지정해야합니다. 당신이 너무 코드에서 할 것을 원하는 경우에 당신은

+0

그는 코드를 통해 연결 문자열을 지정하는 방법을 찾고있었습니다. – cbeuker

관련 문제