をASP.NET会員は、プロファイルMVCの作成方法を教えてくださいユーザーに設定してHttpContext.ます。ユーザー?

StackOverflow https://stackoverflow.com/questions/2547290

質問

私は実装のカスタムプオブジェクトのコードで記述されるジョエルはこちら

どのように割り当て布ます。

どんな仕事をしたい新しいユーザーしています。私はこの:

Membership.CreateUser(userName, password);
Roles.AddUserToRole(userName, "MyRole");

のユーザーが作成され、追加のデータベース HttpContext.Current.User はまだ空、 Membership.GetUser() はnullを返しますので、これらのジョエルのコードな作品:

static public AccountProfile CurrentUser
{
    get { return (AccountProfile)
                     (ProfileBase.Create(Membership.GetUser().UserName)); }
}

AccountProfile.CurrentUser.FullName = "Snoopy";

たって呼び出し Membership.GetUser(userName) および設定プロファイル特性をそのように、そのプロパティを設定します。継続して、呼び出し AccountProfile.CurrentUser(userName).Save() はあまり問題にはなりませんが何らかのデータベースです。このユーザーの有効&ログインを呼び出し Membership.ValidateUser, FormsAuthentication.SetAuthCookie, 等 が、現在のユーザがnullまたは匿名(状態によっては、私のブラウザのクッキー).

解明(編集さらに、下記を参照してください): に基づくFranci Penovの説明とも実験をきっかけになるかもしれないとの問題です。ジョエルのコードに変化しただけに作用する既存ます。ない場合は概要が存在する ProfileBase.Create(userName) 戻り新しい空のオブジェクト毎時という;きのプロパティを設定します。んは、"スティック"が新しいインスタンスが返されまアクセスします。設定 HttpContext.Current.User 新しい GenericPrincipal するユーザオブジェクトが ない プロファイルオブジェクト、 ProfileBase.Create(userName)HttpContext.Current.Profile もに、空のオブジェクト。

を処理しなければいけないプロファイルのための新しく作成されたユーザの要求を呼出す必要があります。 HttpContext.Current.Profile.Initialize(userName, true).その後の移植に初期化されたプロファイルに保存すると、アクセス可能で、今後のご要望により名前、ジョエルのコードします。私 のみ を使用 HttpContext.Current.Profile 内部的には、が必要なとき作成中にアクセスプロファイルに。その他の要求に使っている ProfileBase.Create(userName), かさみそのバージョンとしています。

ご注意Franciが正しい:希望のユーザー、役割を設定で認証された最初の往復のユーザーのプログラミングに、アクセスできるよう、これまでのプロフィールくだけで経由ジョエルのコードの後。何を投げたというのは"その役割はすぐにアクセスにユーザー作成な初期化が、プロファイルがいません。

私の新しいAccountProfileコード:

public static AccountProfile CurrentUser
{
    get
    {
        if (Membership.GetUser() != null)
            return ProfileBase.Create(Membership.GetUser().UserName) as AccountProfile;
        else
            return null;
    }
}

internal static AccountProfile NewUser
{
    get { return System.Web.HttpContext.Current.Profile as AccountProfile; }
}

新規ユーザーの作成:

MembershipUser user = Membership.CreateUser(userName, password);
Roles.AddUserToRole(userName, "MyBasicUserRole");
AccountProfile.NewUser.Initialize(userName, true);
AccountProfile.NewUser.FullName = "Snoopy";
AccountProfile.NewUser.Save();

その後のアクセス:

if (Membership.ValidateUser(userName, password))
{
    string name = AccountProfile.CurrentUser.FullName;
}

さらにコFranciを説明する認証ライフサイクルの私は呼び出しFormsAuthentication.SetAuthCookie私の検証機能が返boolを示すのに成功、ユーザーです。ます。IsAuthenticatedまでは必ずしも当てはまりませんので、その後のます。

改定: って新作ゲーム更新おつです上記の説明の狭い場合、なかなかできないので核心的な問題を解決する:呼び出しCurrentUser新しいインスタンスを返しますオブジェクトの各時間であるとにかかわらず、既存のプロフィール、またはいません。で定義プロパティとして、僕考えると、このように書いてい

AccountProfile.CurrentUser.FullName = "Snoopy";
AccountProfile.CurrentUser.OtherProperty = "ABC";
AccountProfile.CurrentUser.Save();

(もちろん)の方法でやらねばならない。されたデータを提供する能力を

AccountProfile currentProfile = AccountProfile.CurrentUser;
currentProfile.FullName = "Snoopy";
currentProfile.OtherProperty = "ABC";
currentProfile.Save();

で、自分の故障のための完全に望むこの基本的な点につい宣言CurrentUserプロパティとしてることができるオブジェクトを操作するその代わりに、必要として宣言された GetCurrentUser().

役に立ちましたか?

解決

ユーザーを作成するには、単にユーザーのリストに追加します。しかし、これは現在の要求のための新しいユーザーを認証したり、許可していません。また、現在の要求コンテキストにまたは後続の要求のためにユーザーを認証する必要があります。

Membership.ValidateUserだけで資格情報を検証しますが、それは、現在または後続の要求のためにユーザを認証いません。次の要求が認証されますのでFormsAuthentication.SetAuthCookieは、応答ストリームに認証チケットを設定しますが、それは現在の要求の状態に影響を与えることはありません。

ユーザを認証する最も簡単な方法は、(あなたのアプリでフォーム認証を使用していると仮定)FormsAuthentication.RedirectFromLoginPageを呼び出すことであろう。しかし、この1つは、実際にユーザーを認証する新しいHTTPリクエストを、引き起こすます。

あなたは現在のリクエストを処理するために、あなたのロジックを継続する必要がありますが、ユーザーが認証されるようにする場合あるいは、あなたがGenericPrincipalを作成することができ、新しいユーザーのIDを割り当てて、そのプリンシパルにHttpContext.Userを設定します。

他のヒント

あなたはanonymousIdentificationを有効にした場合、このアプローチの問題に実行しようとしています。むしろMembership.GetUser()。ユーザー名よりも、私はHttpContext.Profile.UserNameを使用することをお勧めします。

このよう...

private UserProfile _profile;
private UserProfile Profile
{
    get { return _profile ?? (_profile = (UserProfile)ProfileBase.Create(HttpContext.Profile.UserName)); }
}

帽子のヒント: SqlProfileProvider - あなたはProfile.GetProfileを使用することができます()プロジェクトでは

まず第一に、あなたの調査結果を共有するためのおかげで@Jeremy。あなたは私が正しい方向に軌道に乗る助けました。第二に、この古いポストをぶつけて申し訳ありません。うまくいけば、これは、誰かがドットを接続するのに役立ちます。

私は最終的にこの作業を得た方法は、私のプロフィールクラス内次の静的メソッドを使用していた。

internal static void InitializeNewMerchant(string username, Merchant merchant)
{
    var profile = System.Web.HttpContext.Current.Profile as MerchantProfile;
    profile.Initialize(username, true);
    profile.MerchantId = merchant.MerchantId;
    profile.Save();
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top