2

特定のアプリケーションに対して、C# コード ビハインド ファイルに裏打ちされた .aspx ログイン フォームがあります。
コード ビハインドでは、次の「自家製」メソッドを使用しています。

private bool AuthenticateUser(String username, String password)
{
    bool validated = false;
    try
    {
        PrincipalContext pc = new PrincipalContext(ContextType.Domain, "domnet.domad.com", "dc=domnet,dc=domad,dc=com");
        IdentityType ADElement;
        UserPrincipal up;

        //Try first with no @DOM.COM - this should work for SamAccountName values:                 
        username = username.ToUpper().Replace("@DOM.COM", "");
        ADElement = IdentityType.SamAccountName;
        up = UserPrincipal.FindByIdentity(pc, ADElement, username);
        validated = pc.ValidateCredentials(username, password, ContextOptions.Negotiate);

        //If SamAccountName fails try UserPrincipalName with @DOM.COM
        if (!validated)
        {
            username = username + "@DOM.COM";
            ADElement = IdentityType.UserPrincipalName;
            up = UserPrincipal.FindByIdentity(pc, ADElement, username);
            validated = pc.ValidateCredentials(username, password, ContextOptions.Negotiate);
        }

        //Put username into session
        if (validated)
        {
            Session["Username"] = username.Replace("@DOM.COM", "");
        }
    }
    catch (Exception) //login failure...
    {
        validated = false;
    }

    return validated;
}

これはアプリケーションでは問題なく機能しますが、認証が必要な他のアプリケーションもあります。
ログインファイルをこれまでのアプリケーションにコピー/貼り付けたくありません。

私の最も基本的な質問は、アプリケーション間で認証コードを集中化するためのオプションは何ですか?

将来的には、
ユーザー名/パスワードだけでなく、AD グループのメンバーシップも確認します。
ユーザーが認証されると、アプリ間でログイン画面が表示されなくなります。(SSO)

この問題に遭遇したのは私が初めてではないように思えます。
可能であれば、独自のソリューションを開発するよりも、すぐに使用できるソリューションを使用したいと思います。

4

5 に答える 5

3

あなたは出来る:

于 2012-10-23T19:17:28.230 に答える
2

1つのアプローチはCore、アプリケーション間で共有したい共通部分を含むプロジェクト(.dll / library)を作成し、アプリケーションでそのプロジェクトを参照することです。

つまり、2つのアプリケーションがあるABします。3つのプロジェクトを作成ABますCore。プロジェクトAとBでは、プロジェクト参照をコアライブラリに追加するだけです。これで、AとBの両方からコア内の任意のメソッドにアクセスできます。

このアプローチは、SVNおよび同様のバージョン管理システムでうまく機能し、非常に柔軟な作業方法であることがわかります。難しいのは、実際に一般的なコードを特定し、可能な限り一般的にすることです。

于 2012-10-23T19:14:44.460 に答える
2

@Baxterこの質問は数日前に投稿されたため、私の答えが少し遅れるかどうかはわかりませんが、MVC 3アプリケーションに集中セッションと認証管理を実装するという同じ問題を調査しています。次のリンクは、非常に興味深い:http: //www.codeproject.com/Articles/246631/ASP-NET-MVC3-Form-Authentication

上記のリンクに対応する記事の作成者は、認証機能を別のDLLに分解し、依存性注入を使用してアプリケーションコンテキストを使用して外部の「セキュリティ」DLLを利用します。私はこのアプローチを使用してセキュリティメカニズムを一元化し、3つの異なるMVC 3 Webアプリケーションで再利用することを計画しているので、まだ調査中であり、私が見つけたものに応じてこの回答を更新します:)

于 2012-10-29T15:33:37.287 に答える
1

このメソッドを別のプロジェクト(別のdllを意味する)にリファクタリングして、このコードを使用する任意のWebアプリケーションからそのプロジェクトを参照できます。

于 2012-10-23T19:14:33.490 に答える
0

Windows 認証を使用している場合の代替方法は、SID を取得し、AD とアプリケーションのユーザー テーブル (電子メール アドレスを使用) の間で共有される情報を AD にクエリし、ユーザー テーブルに次のエントリがあるかどうかを確認することです。そのメールアドレス。

このように、ワークステーションにログオンすることにより、基本的に、この認証方法を使用するすべてのアプリケーションに事前にログインされます。新しいユーザー アカウントを (アプリケーション レベルで) 作成するときに、認証のために確認する情報を取得する必要があります (これが、メール アドレスを使用する理由です。誰もが会社のメール アドレスを知っています)。

これは、Avada Kedavra によって提案された Core ライブラリ メソッドと非常にうまく機能します。この方法では、各アプリケーションが独自のユーザー ベースを維持することもできます (ただし、中央のユーザー データベースでもうまく機能します)。

于 2012-10-23T19:33:21.160 に答える