web-dev-qa-db-ja.com

ユーザーを作成し、ASP.NET Identityで新しく作成されたIDを取得する方法

ASP.NET Identityフレームワークは初めてで、以前のFormsAuthenticationフレームワークで使用していたことをいくつか実行しようとしています。

私がやりたいことは、管理ユーザーがアプリ内から既存の登録ビュー(または同様の)を使用して新しいユーザーを作成できるようにすることです。これが完了したら、そのユーザーを(場合によっては生成されたIDを使用して)システムの他の領域に関連付けます。

UserManager.CreateAsync()を呼び出すときに生成されるIDにアクセスするにはどうすればよいですか?

編集:「管理」ロールを持つ既存のユーザーに、ユーザー管理エリアのシステム内からユーザーを作成してもらいたい。これまでの回答では、「現在の」ユーザーのIDを取得する方法について説明しましたが、これは私が探しているものではありません。

26
FrankO

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;
}
_
23

私はこれを共有するだろうと思ったので、受け入れ答えは私には明確ではありませんでした。

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;

}
15
matt.

私のために働いたのはわずかに異なるものでした:

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;
}
7

次のようないくつかの拡張メソッドがIdentityフレームワークに追加されました。

public static string GetUserId(this IIdentity identity);

サインインを実行すると、IDを簡単に取得できるようになります。

await SignInAsync(user, isPersistent: false);
var id = this.User.Identity.GetUserId()
4
Mister Epic

このスレッドはすでに数年前ですが、提供された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...
0
embee