サンプル テーブル プロファイル プロバイダーをhttp://www.asp.net/downloads/sandbox/table-profile-provider-samplesから新しい MVC 2 サイトに追加しようとしています。
少し調べたりいじったりした後、このようなプロファイル クラスにたどり着きました。
namespace MyNamespace.Models
{
public class UserProfile : ProfileBase
{
[SettingsAllowAnonymous(false),CustomProviderData("FirstName;nvarchar")]
public string FirstName
{
get { return base["FirstName"] as string; }
set { base["FirstName"] = value; }
}
[SettingsAllowAnonymous(false),CustomProviderData("LastName;nvarchar")]
public string LastName
{
get { return base["LastName"] as string; }
set { base["LastName"] = value; }
}
public static UserProfile GetUserProfile(string username)
{
return Create(username,false) as UserProfile;
}
public static UserProfile GetUserProfile()
{
return Create(Membership.GetUser().UserName,true) as UserProfile;
}
}
}
そして、次のようなweb.config
<profile enabled="true" defaultProvider="TableProfileProvider" inherits="MyNamespace.Models.UserProfile">
<providers>
<clear />
<add name="TableProfileProvider" type="Microsoft.Samples.SqlTableProfileProvider" connectionStringName="ContentDB" table="aspnet_UserProfiles" applicationName="/"/>
</providers>
</profile>
途中でわかったと思うことは、
<profile>
MVC でカスタム プロバイダーを使用するには、web.configの要素に "inherits" 属性が必要です。これにより<properties><add ....>
、同じプロファイル フィールド名を持つコンストラクトを使用できなくなります。- サンプル SQL テーブル プロファイル プロバイダーには
CustomProviderData
属性が必要ですが、上記の理由により、web.config ファイルに表示されないため、属性としてプロファイル クラスのプロパティに追加する必要があります。
ユーザーがログインすると、すべて正常に動作するようです。ただし、新しいユーザー登録プロセスの一環としてプロファイル データを取得したいのですが、ユーザーがログインするまでプロファイル オブジェクトにアクセスできないようです。
MVC テンプレート コードの新しいユーザー登録セクションに、プロファイル データを保存するための呼び出しを追加しようとしました。
FormsService.SignIn(model.UserName, false /* createPersistentCookie */);
UserProfile profile = UserProfile.GetUserProfile(Membership.GetUser().UserName);
profile.FirstName = "Doug";
Profile.Save();
return RedirectToAction("Index", "Home");
ただしMembership.GetUser()
、ユーザーが実際にログインするまではnullのようです。モデルのユーザー名も使用してみました。
FormsService.SignIn(model.UserName, false /* createPersistentCookie */);
UserProfile profile = UserProfile.GetUserProfile(model.UserName);
profile.FirstName = "Doug";
profile.Save();
return RedirectToAction("Index", "Home");
これはもう少し先のことですが、FirstName プロファイル フィールドを設定しようとすると失敗し、「属性を匿名ユーザーとして設定しようとしていますが、これは許可されていません」という行に沿ったエラー メッセージが表示されます (申し訳ありませんが、アクセスできません)。これを入力している正確なメッセージに)。
これを回避する方法はありますか?FormsServer.SignIn
フォーム認証に関する限り、メソッドは実際にユーザーをログインさせないように見えます。完全にログインするにはラウンドトリップが必要であり、おそらく Cookie をサーバーに送信する必要があります。
これを回避する簡単な方法がない場合は、データ アクセス メソッド (aspnet_UserProfiles に挿入 ....) を使用して、プロファイル テーブルに直接データを入力することができます。これは行き過ぎた橋でしょうか、それとも実行可能な解決策でしょうか?
誰もこの問題を抱えていませんか?いいえ?私だけ!
更新するために、フランシ・ペノフがこの投稿への回答で提案したことを試しました。
だから、今私のコードはこのようになります。
FormsService.SignIn(model.UserName, false /* createPersistentCookie */);
GenericIdentity id = new GenericIdentity(model.UserName);
HttpContext.User = new GenericPrincipal(id, null);
UserProfile profile = UserProfile.GetUserProfile(Membership.GetUser().UserName) as UserProfile;
profile.FirstName = "Doug";
profile.Save();
return RedirectToAction("Index", "Home");
現在、少なくとも Membership.GetUser() の呼び出しは有効なMembershipUser
オブジェクトを返しますが、FirstName プロファイル プロパティを設定しようとすると、メッセージが表示されます。This property cannot be set for anonymous users.
そのため、メンバーシップに関する限り、ユーザーはログオンしていますが、プロファイル システムはまだログオンしていないと考えています。
何か案は?