1

ユーザーのプロファイル情報をセッションまたはキャッシュに保存し、ページが読み込まれるたびにその情報を手元に置いて、ページを読み込むたびにデータベースを呼び出さないようにする方法を作成しようとしています。これらの値の一部を共有レイアウトに配置できるようにしたい (ユーザーの名前を右上隅などに配置できるようにするため)。マスター ページ レイアウトの上部には、次のものがあります。

@{  

    Domain.Entities.UserProfile user = (Domain.Entities.UserProfile)HttpContext.Current.Session[Membership.GetUser().ProviderUserKey.ToString()]; 
}

user.FirstNameマスター ページのような値を使用します。ユーザーがログインすると、セッションが設定されます。これを行うより良い方法はありますか?ログアウトしてメンバー専用ページに移動すると、ユーザー プロファイルがまだセッションに保存されていないため、[Authorize]フィルターがバイパスされてエラーが発生します。Object reference not set to an instance of an object.UserId などの機密情報はセッションに保存しません。ユーザー名、プロフィール画像の URL などだけです。このようなタスクを実行するためのより良い方法があると思います。

4

2 に答える 2

0

セッション状態に格納されるユーザー プロパティを取得するためのインターフェイスとして静的クラスを作成できます。

public class UserData{

    public static Domain.Entities.UserProfile GetUser(){
        string username;
        try{
            username = Membership.GetUser().ProviderUserKey.ToString();
        }catch(Exception e){
            //  just in case
            throw new AuthenticationException("The user isn't authenticated!");
        }

        var user = HttpContext.Current.Session[username] as Domain.Entities.UserProfile;
        if(user == null){
            user = //   get data from database
            HttpContext.Current.Session[username] = user;
        }
        return user;
    }
}

次に、メソッドで次のように使用できます。

if (User.Identity.IsAuthenticated)
{
    UserProfile user = UserData.GetUser();

    //Your code goes here, no way user data is null.
}

またはコントローラーで:

[Authorize]
public ActionResult Index(){

    UserProfile user = UserData.GetUser();

    return //stuff
}

注: 私はこれをテストできずに作成しましたが、要点を理解していただければ幸いです :)

于 2013-01-14T19:37:27.990 に答える
0

ユーザー情報を認証 Cookie に保存できます。Cookie は、リクエストごとにクライアントとの間で送受信されることに注意してください。そのため、保存する情報が多い場合、それは適切な方法ではない可能性があります。

追加のユーザー データを Cookie に保存する方法を説明しているこのドキュメントの手順 4 を確認してください http://www.asp.net/web-forms/tutorials/security/introduction/forms-authentication-configuration-and-advanced-topics- cs

次に、マスターページで、次のようなものを持つことができます

@{  

if (User.Identity.IsAuthenticated)
{
    //Your code goes here, no way user data is null.
}
于 2013-01-14T19:03:53.497 に答える