2013-07-19 2 views
0

Мы разрабатываем веб-сайт, который должен указывать на разных поставщиков LDAP (ADService ConnectionString), когда пользователь пытается войти в систему.nJupiter change ADService Connectionstring @ runtime

Наш подход будет состоять в том, чтобы посмотреть их имя пользователя [email protected] и использовать файл сопоставления (возможно, базу данных sqlServer), чтобы сопоставить свое имя входа своему провайдеру услуг adervice и затем взять строку подключения. Затем продолжайте, как обычно.

В приведенном ниже примере кода мне потребуется аутентификация IsAuthenticated для проверки подлинности строки подключения AdService. Я просто не знаю, где и когда следует сообщить провайдеру NJupiter DataAccess Ldap, когда нужно установить строку соединения. (Обычно с nJupiter это делается в файле web.config - но мне нужно будет изменить строку подключения динамически)

Таким образом, наша страница login.aspx.cs имеет следующий код:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (User.Identity.IsAuthenticated) 
    { 
     if (!string.IsNullOrEmpty(Request.QueryString["ReturnUrl"])) 
     { 
      Response.Redirect("~/AccessDenied.aspx"); 
     } 
    } 
} 

ответ

1

nJupiter .DataAccess.Ldap поддерживает одновременную настройку нескольких серверов в файле конфигурации. Я предлагаю вам настроить все серверы, которые вы собираетесь использовать в nJupiter.DataAccess.Ldap.config так:

<configuration> 
    <ldapServers> 
     <ldapServer value="MyServer1"><!-- config goes here --></ldapServer> 
     <ldapServer value="MyServer2"><!-- config goes here --></ldapServer> 
    </ldapServers> 
</configuration> 

И тогда вы можете настроить один MembershipProvider/RoleProvider для каждого сервера в Web.Config; как это:

<system.web> 
    <membership defaultProvider="MyProvider1"> 
     <providers> 
     <clear/> 
     <add name="MyProvider1" ldapServer="MyServer1" type="nJupiter.DataAccess.Ldap.LdapMembershipProvider,nJupiter.DataAccess.Ldap" /> 
     <add name="MyProvider2" ldapServer="MyServer2" type="nJupiter.DataAccess.Ldap.LdapMembershipProvider,nJupiter.DataAccess.Ldap" /> 
     </providers> 
    </membership> 
</system.web> 

Вы можете переключаться между провайдерами в режиме исполнения с помощью System.Web.Security.Membership.Providers["MyProvider1"] и System.Web.Security.Membership.Providers["MyProvider2"].

ASP.NET поддерживает только один поставщик по умолчанию, поэтому, если вы хотите перенаправить разных пользователей на разных поставщиков, но все же хотите использовать обычную архитектуру ASP.NET, я предлагаю вам сделать wrapper MembershipProvider/RoleProvider, которые динамически перенаправляют правильные поставщик. Вот некоторые псевдо-код:

public class RedirctingMembershipProvider : System.Web.Security.MembershipProvider { 
    public override MembershipUser GetUser(string username, bool userIsOnline) { 
     if(username.Contains("@MyDomain1"){ 
      return Membership.Providers["MyProvider1"].GetUser(username, userIsOnline); 
     } 
     if(username.Contains("@MyDomain2"){ 
      return Membership.Providers["MyProvider2"].GetUser(username, userIsOnline); 
     ... 

, а затем зарегистрировать поставщика в качестве поставщика по умолчанию в файле web.config, как это:

<system.web> 
    <membership defaultProvider="RedirctingMembershipProvider"> 
     <providers> 
     <clear/> 
     <add name="RedirctingMembershipProvider" type="MyNameSpace.RedirctingMembershipProvider,MyAssembly" /> 
     <add name="MyProvider1" ldapServer="MyServer1" type="nJupiter.DataAccess.Ldap.LdapMembershipProvider,nJupiter.DataAccess.Ldap" /> 
     <add name="MyProvider2" ldapServer="MyServer2" type="nJupiter.DataAccess.Ldap.LdapMembershipProvider,nJupiter.DataAccess.Ldap" /> 
     </providers> 
    </membership> 
</system.web>