ASP.NET Identityフレームワークは初めてで、以前のFormsAuthenticationフレームワークで使用していたことをいくつか実行しようとしています。
私がやりたいことは、管理ユーザーがアプリ内から既存の登録ビュー(または同様の)を使用して新しいユーザーを作成できるようにすることです。これが完了したら、そのユーザーを(場合によっては生成されたIDを使用して)システムの他の領域に関連付けます。
UserManager.CreateAsync()を呼び出すときに生成されるIDにアクセスするにはどうすればよいですか?
編集:「管理」ロールを持つ既存のユーザーに、ユーザー管理エリアのシステム内からユーザーを作成してもらいたい。これまでの回答では、「現在の」ユーザーのIDを取得する方法について説明しましたが、これは私が探しているものではありません。
IdentityUser
を使用するか、IdentityUser
を継承するクラスを使用すると、モデルにUserId
属性が設定されます。次のコードを使用して、ユーザーをメソッドに渡すと、IDがいっぱいになります。
_var user = model.GetUser();
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
result = UserManager.AddToRole(user.Id, "User");
_
model.GetUser()
は、ApplicationUser
またはIdentityUser
のオブジェクトを返します
_public ApplicationUser GetUser()
{
var user = new ApplicationUser
{
UserName = UserName,
FirstName = FirstName,
LastName = LastName,
Email = Email,
...
};
return user;
}
_
私はこれを共有するだろうと思ったので、受け入れ答えは私には明確ではありませんでした。
IdentityUser クラスの source を見ると、次のことがわかります。
public class IdentityUser : IdentityUser<string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>, IUser, IUser<string>
{
/// <summary>
/// Constructor which creates a new Guid for the Id
/// </summary>
public IdentityUser()
{
this.Id = Guid.NewGuid().ToString();
}
... code omitted
}
ご覧のとおり、新しいIdentityUser
インスタンスを作成すると、コンストラクターは新しいGUID=を生成し、IDフィールドに値を設定します。
つまり、ApplicationUser
などの派生クラスの新しいインスタンスを作成すると、新しいIDが自動的に生成されます。
そのため、ユーザーが正常に追加されたことを確認した後、データ関連付けにApplicationUser
クラスのIdを安全に使用できます。
例。
var user = new ApplicationUser
{
UserName = "franko",
FirstName = "Frank",
LastName = "Ouimette",
Email = "[email protected]"
};
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded){
result = UserManager.AddToRole(user.Id, "User");
// User added successfully, you can safely use the Id now.
var id = user.Id;
}
私のために働いたのはわずかに異なるものでした:
var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
var user = new ApplicationUser() { Email = "[email protected]", UserName = "[email protected]" };
var result = manager.Create(user, "TestPass44!");
if (result.Succeeded)
{
string newId = user.Id;
}
次のようないくつかの拡張メソッドがIdentityフレームワークに追加されました。
public static string GetUserId(this IIdentity identity);
サインインを実行すると、IDを簡単に取得できるようになります。
await SignInAsync(user, isPersistent: false);
var id = this.User.Identity.GetUserId()
このスレッドはすでに数年前ですが、提供されたGuids
を使用せず、データベースによって提供される標準の整数ID(自動増分インデックス)を使用しないため、この問題が発生し、別のソリューションを見つける必要がありました。
私が抱えていた問題は、UserManager.CreateAsync
でユーザーを作成した場合、ユーザーオブジェクトがIDで更新されなかったことです。その後、そのユーザーの関連オブジェクトを作成しましたが、IDが更新されなかったため、Entity Frameworkはユーザーをデータベースにもう一度保存しようとして、プライマリキー違反が発生しました。
この問題を解決するには、次のようにユーザーオブジェクトを読み取り/更新する必要がありました。
var user = new User
{
UserName = UserName,
FirstName = FirstName,
LastName = LastName,
Email = Email,
...
};
var result = await UserManager.CreateAsync(user, model.Password);
// At this point, the user has been created, but the ID not set
// Read the full user record from the database
user = db.Users.Where(u => u.Email == user.Email).FirstOrDefault();
// At this point, the user has the correct ID set, we are good to go...