2009-03-09 3 views
2

Я работаю над веб-сайтом с внутренней и внешней секциями.Как иметь несколько логинов с ASP.Net?

Пользователи обоих разделов отличаются друг от друга, поэтому им нужна другая страница входа. Я хотел бы настроить аутентификацию по-разному для обеих папок, но ASP.Net, но это запрещено.

Пример (в моем главном web.config):

<authentication mode="Forms"> 
    <forms loginUrl="~/Pages/Internal/Main.aspx" defaultUrl="~/Pages/Internal/Main.aspx" cookieless="UseDeviceProfile" name=".ApplicationAuthenticatedUser" path="/" protection="All" slidingExpiration="true" timeout="45"/> 
</authentication> 

И во внешней вложенной, я стараюсь, чтобы заменить параметры:

<authentication mode="Forms"> 
    <forms loginUrl="~/Pages/External/Default.aspx" defaultUrl="~/Pages/External/Default.aspx" cookieless="UseDeviceProfile" name=".ApplicationAuthenticatedUser" path="/Pages/External" protection="All" slidingExpiration="true" timeout="45"/> 
</authentication> 

Однако это дает мне ошибку.

Я попытался поместить оба из них в свои подпапки, но я получаю ту же ошибку, раздел конфигурации аутентификации должен быть установлен на уровне приложения (я предполагаю, что это означает root web.config).


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

Это сработает, но если возможно, мне бы понравилось решение, где я могу настроить его в файле web.config.

Благодаря

ответ

1

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

Несмотря на это, если у вас должно быть два магазина, лучший выбор - это обмануть приложение. Это может быть точное приложение, но вы помещаете его на один внутренний сервер и один внешний. Затем вы можете аутентифицировать пользователей в разных местах. Обратите внимание, однако, что вам по-прежнему нужны роли, если вы не пытаетесь закрыть приложение.

Если вам нужно пройти аутентификацию в двух магазинах, вы можете сделать это с помощью настраиваемого поставщика. ASP.NET модель Войти позволяет для пользовательских поставщиков, и это очень легко построить один: http://msdn.microsoft.com/en-us/library/f1kyba5e.aspx http://msdn.microsoft.com/en-us/library/aa479048.aspx

Теперь, если вы должны перенаправить на другие страницы (вы застряли в этой модели по какой-то причине?), Возможно, вы можете сделать по IP-адресу. Вероятно, ваша внутренняя сеть использует 10-точечную или 192-точечную IP-схему. Если это так, эти адреса передаются во внутренние. Остальное - внешнему. Это потребует от вас настройки того, что делает перенаправление. Я знаю, что вы можете сделать это на странице входа, если не с обработчиком HTTP.

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

+0

Я не против иметь одно и то же хранилище данных пользователя, мне просто нужны разные страницы входа (и, возможно, разные конфигурации для обоих, как время истечения срока действия). – mbillard

0

Если вы можете запустить в двух различных приложений IIS, то вы можете иметь различные поставщиков проверки подлинности (или разных экземпляров одного и того же поставщика ... возможно, используя ту же базу данных с атрибутом приложения на поставщика, чтобы отличить).

Но разные веб-приложения не имеют общего состояния (приложения и сеанса) и дублируют установку. Для интрасети/Интернета это позволит внешнему развертыванию не включать компоненты, к которым пользователь Интернета не может получить доступ (и, таким образом, повысить безопасность за счет уменьшения площади поверхности).

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

+0

Это возможность, но я теряю слишком много, делая это. – mbillard

0

Если ваш ваш сайт один веб-приложение, вы могли бы, вероятно, использовать ASP.NET Модель поставщика роли для этого, имеющая две роли: одна для внутренней и одна для внешних страниц (вы можете настроить эту папку pr с помощью элемента конфигурации < >).

Для получения дополнительной информации см http://msdn.microsoft.com/en-us/library/9ab2fxh0.aspx

+0

У меня это есть, я просто хочу, чтобы вы автоматически перенаправляли пользователей, пытающихся получить доступ к внешней странице во внешний логин. – mbillard

0

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

Вероятно, не самое элегантное решение, но достаточно просто:

Public Sub btnSubmit_Click(ByVal sender As Object, ByVal e As EventArgs) 
     If Page.IsValid Then 
      Dim userLogin As String = "" 

      userLogin = System.Guid.NewGuid.ToString 
      FormsAuthentication.RedirectFromLoginPage(userLogin, False) 
      ' place a url param throughout my app, only four pages so no 
      ' big problem there in this case g stands for guest   
      Response.Redirect("menu.aspx?m=g", False) 

     End If 
End Sub 

Тогда в Global.asax:

Protected Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As System.EventArgs) 

     If Not Request.IsAuthenticated And _ 
(Not Request.RawUrl.ToLower.Contains("guestlogin.aspx")) And _ 
(Not Request.RawUrl.ToLower.Contains("registeredlogin.aspx")) And _ 
(Not Request.RawUrl.ToLower.Contains("mobilelogin.aspx")) Then 
      Response.Redirect("spLogin.aspx?m=" & Request.QueryString("m")) 
     End If 

    End Sub 

Затем на странице входа в систему (тот, что указан в вашем Web. config):

 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
      If Not Page.IsPostBack Then 
    if request.querystring("m")="g" then 
        Response.Redirect("guestlogin.aspx?m=g") 

    elseif request.querystring("m")="r" then 
        Response.Redirect("registeredlogin.aspx?m=r") 
    elseif request.querystring("m")="m" then 
        Response.Redirect("mobilelogin.aspx?m=m") 

end if 
End If 
End Sib