C#
ASP.NET

ASP.NET IdentityのUserStoreを自分で作る

More than 5 years have passed since last update.

mochalogからの転載です。

ASP.NET Identityで自前のIUserStoreを実装する方法です。

まず、IUserを実装します。

Idが取得できて、UserNameが取得・設定できればそれでOKです。

public class MyUser : IUser

{
public string Id { get; private set; }
public string UserName { get; set; }
public MyUser(string id, string userName)
{
Id = id;
UserName = userName;
}
}

次にIUserStoreを実装します。

CreateAsync、DeleteAsync、などIUser実装クラスのCRUD処理を実装します。

例ではメモリ内のListに格納するようにします。

public class MyUserStore : IUserStore<MyUser>

{
private List<MyUser> _storedUsers = new List<MyUser>();

public Task CreateAsync(MyUser user)
{
_storedUsers.Add(user);
return Task.FromResult(0);
}

public Task DeleteAsync(MyUser user)
{
_storedUsers.Remove(user);
return Task.FromResult(0);
}

public Task<MyUser> FindByIdAsync(string userId)
{
var ret = _storedUsers.Where(u => u.Id == userId).SingleOrDefault();
return Task.FromResult(ret);
}

public Task<MyUser> FindByNameAsync(string userName)
{
var ret = _storedUsers.Where(u => u.UserName == userName).SingleOrDefault();
return Task.FromResult(ret);
}

public Task UpdateAsync(MyUser user)
{
var index = _storedUsers.IndexOf(user);
if (index < 0)
{
throw new ArgumentException("指定されたユーザーは登録されていません。");
}
_storedUsers[index] = user;
return Task.FromResult(0);
}

public void Dispose()
{
// do nothing
}
}

これで最低限の機能は実装しました。

さらにパスワードの保存、ロールの設定、外部サービスによるログイン対応などに対応するには

IUserPasswordStore<>、IUserRoleStore<>、IUserLoginStore<>などを必要に応じて実装します。

実装についてはMyUserに対応する情報が持てるようプロパティ・メソッドを増やして、

各インタフェースのメソッド内で格納・削除・更新・取得できるようにするだけなので割愛します。

public class MyUserStore : IUserStore<MyUser>,

IUserPasswordStore<MyUser>, IUserRoleStore<MyUser>,
IUserLoginStore<MyUser>
{
/// 省略

あとは UserManager = new UserManager<MyUser>(new MyUserStore()); として、UserManagerをかぶせて使用します。

UserManagerの使用例はASP.NETプロジェクトを作ってAccountControllerを見てください。

この例ではメモリ内のListにデータを保持しましたが、

データベースなりファイルなり他のデータソースに保存するUserStoreも簡単に実装できます。