Как иметь несколько входов в систему с помощью ASP.Net?

StackOverflow https://stackoverflow.com/questions/626422

Вопрос

Я работаю над сайтом с внутренним и внешним разделом.

Пользователи обоих разделов разные, поэтому им требуется другая страница входа.Я хотел настроить аутентификацию по-разному для обеих папок, но в 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>

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

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


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

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

Спасибо

Это было полезно?

Решение

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

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

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

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

Однако кажется, что это очень большая работа.Я до сих пор не вижу картины, почему нужно выполнять задачу именно таким образом.

Другие советы

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

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

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

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

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

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

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

    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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top