ASP.Net で複数のログインを行うにはどうすればよいですか?
-
06-07-2019 - |
質問
私は内部セクションと外部セクションを持つ Web サイトに取り組んでいます。
両方のセクションのユーザーは異なるため、異なるログイン ページが必要になります。両方のフォルダーと 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 で構成できるソリューションが欲しいです。
ありがとう
解決
混乱していますか?なぜ2つのユーザーデータストアがあるのですか?私は内部と外部を理解していますが、これが同じアプリケーションである場合、ロールを割り当てて内部ユーザーにより多くの許可を与えることができます。さらに、内部ユーザーがVPNなしで自宅からサイトにアクセスできるようにすることができます。
それでも、2つの店舗が必要な場合、最善の策はアプリケーションをコピーすることです。正確なアプリケーションにできますが、1つの内部サーバーと1つの外部サーバーに配置します。その後、さまざまな場所でユーザーを認証できます。ただし、アプリケーションを把握していない限り、まだロールが必要です。
2つのストアに対して認証する必要がある場合は、カスタムプロバイダーで認証できます。 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ハンドラを使用しない場合は、ログインページでこれを行うことができます。
ただし、これは非常に多くの作業のようです。この方法でタスクを達成しなければならない理由の写真はまだ見ていません。
他のヒント
2つの異なるIISアプリケーションとして実行できる場合、異なる認証プロバイダー(または同じプロバイダーの異なるインスタンス...おそらくプロバイダーのアプリケーション属性を持つ同じデータベースを使用して区別できます)
しかし、異なるWebアプリは、共有状態(アプリケーションとセッション)がなく、インストールを複製することを意味します。イントラネット/インターネットの場合、これにより、インターネットユーザーがアクセスできないコンポーネントを外部展開に含めることができなくなります(したがって、表面積を減らすことでセキュリティが向上します)。
それ以外の場合は、ログインしているユーザーに応じて、組み込みの認証プロバイダーのいずれかに転送するカスタム認証プロバイダーが必要になる場合があります。
サイトが単一の Web アプリケーションである場合は、おそらく、内部ページ用と外部ページ用の 2 つのロールを持つ ASP.NET ロール プロバイダー モデルを使用できます (そのprを構成できます)。<location> 構成要素を持つフォルダー)。
詳細については、「」を参照してください。 http://msdn.microsoft.com/en-us/library/9ab2fxh0.aspx
これを処理する簡単な方法があり、それは誰かに役立つかもしれません。基本的に、ゲストログインと登録ユーザーに同じコードを使用できるようにしたいと考えています。また、認証チケットの有効期限が切れたときに別のログインページに送信するモバイルバージョンのWebサイトもあります。
おそらく最もエレガントなソリューションではありませんが、十分にシンプルです:
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