混合ASP.NETフォーム認証(AD + DB)を実装する最良の方法は何ですか?
-
03-07-2019 - |
質問
ASP.NET Webサイトにフォーム認証を実装したい場合、サイトはデータベース上のユーザーを検索してデータを取得し、LDAP(Active Directory)に対して認証してユーザー/パスワードの組み合わせを検証する必要があります。
その後、さまざまな形式で使用するユーザーを表すクラスのインスタンスを保持する必要があります。
以前の条件を確認し、 AuthenticateEventArgs.Authenticated = true
を実行し、セッション内にオブジェクトを配置したログインコントロールを使用して、それを実行しようとしました: Session [" user&quot ;] = authenticatedUser;
両方の同期に問題がありました(認証Cookieの前にセッションが期限切れになり、ページが現在無効なセッションオブジェクトを使用しようとしたときにNullReferenceExceptionsを取得しました)。
これを達成する最良の方法はどれですか?セッションタイムアウトをCookieの寿命と同期させる方法はありますか?ユーザーオブジェクトは他の方法で保存する必要がありますか?ポイントを逃しましたか?
更新: サイトは外部のプライアットネットワークからアクセスできる必要があるため、Windows認証プロバイダーを使用できません。
解決
メイン認証プロバイダーとしてWindows認証を使用しますが、ユーザー情報用に独自の単純なデータベース永続性をロールバックします。
セッションメソッドは機能します。IISでセッションタイムアウトを調整し、認証Cookieタイムアウトと一致させることができます。
また、セッションをクリアするエッジケース(アプリプールのリサイクルなど)をキャッチするために、HTTPModuleでこのようなことを行うことができます
擬似コード:
if (session["user"] == null)
{
Authentication.SignOut();
}
これにより、ユーザーは強制的に認証されます。
他のヒント
セッションと認証Cookieのタイムアウト値を同じ値に設定します。認証Cookieにスライディングウィンドウを使用しています。また、セッションから取得した値を使用しようとする前に決してnullでないと仮定しないことを習慣にします。私は、セッションに保存する値の厳密に型指定されたプロパティを含むプロキシクラスにすべてのセッション機能を抽象化します。不正なセッションデータのエラー処理は、プロキシにローカライズされています。
セッションでのユーザー情報の保存は正常に機能します。セッションタイムアウトと認証Cookieタイムアウトを同期するには、web.configを編集するだけです:
<sessionState timeout="XX" />
<authentication mode="Forms">
<forms loginUrl="Login.aspx" timeout="XX" />
</authentication>
両方の値は分単位です。
セッションから値を取得するたびにnullをテストしてください!