2

別のプログラマーを開始したプロジェクトを終了しています。アーキテクチャ全体を変更することはできませんが、いくつか上書きしたいことがあります。つまり、承認、および現在のユーザーセッションを保存する方法です。プロジェクトは、soap サービスを介してサーバーと通信するクライアントを表します。サーバーには、Security-Services と、A サービス、B サービスなどのいくつかのサービスがあります。セキュリティ サービスは、他のサービスを初期化するための認証とセッション キーを提供します。このプロジェクトは ASP.NET MVC3 で記述されています。これはユーザー モデルのヘッドであり、サービスと対話する方法を記述したシングルトーン クラスとして実装されています。承認のしくみ - オーバーライドされた ValidateUser メソッドを持つ CustomMembershipProvider があり、Security-service で動作します。

class SiteUser 
{ 
    public static SiteUser Current 
    { 
        get 
        { 
            if (HttpContext.Current.Session.IsNewSession & &! HttpContext.Current.User.Identity.IsAuthenticated) 
            { 
                throw new UserAutorizationExeption () {Reason = AuthExceptionReason.NewSession}; 
            } 

            if (HttpContext.Current.Session [sessionKey] == null) 
            { 
                FormsAuthentication.SignOut (); 
                throw new UserAutorizationExeption () {Reason = AuthExceptionReason.ServerSessionExpired}; 
            } 

            return HttpContext.Current.Session [sessionKey] as W1User; 

        } 
        set 
        { 
            if (HttpContext.Current.Session! = null) 
            { 
                HttpContext.Current.Session [sessionKey] = value; 
            } 
        } 
    } 

    public SiteUser () 
    { 
    } 


    public static SiteUser Create () 
    { 
        SiteUser.Current = new SiteUser (); 

        return SiteUser.Current; 
    } 

    / / Web-services methods go here 
} 

主な問題は、セッションがメモリに保存されるようになったことです: web.config:

<sessionState mode="InProc" timeout="20" /> 

Set SqlServer-mode は、SiteUser のシリアル化が困難になるため問題があります。どうすればこれを回避できますか? また、認証に問題があります - サービスのセッションで Asp.Net 同期セッションを正しく行うにはどうすればよいですか? 説明が必要な場合は、私の英語で申し訳ありません-質問してください。ありがとうございました。

4

1 に答える 1

1

私は個人的に物事を単純にすることを好むので、できればサービスを使用する専用のユーザーを用意して、サービス層までユーザーを偽装する必要がないため、セッションキーを維持する必要がありません。

特にサービスレイヤーがサードパーティや監査などにサービスを提供するSOA環境では、常に可能であるとは限りません。実際、私のプロジェクトは次のようになります。

ユーザーをサービス層に偽装する必要がある場合、セッションを行うことから逃れることはできません。InProcセッションはより優れたパフォーマンスを提供し、SqlServerモードはより優れたスケーラビリティを提供します- トレードオフの決定はあなた次第です。

ユーザーのセッションキーをユーザーテーブル自体に保存し、毎回取得して、ユーザーがログアウトするときに無効にする代替手段があります。ただし、これはuser session のカスタム実装にすぎません

于 2011-05-09T12:41:23.847 に答える