3

私は MVC と EF を初めて使用し、ユーザーとロールの管理に Identity を使用するプロジェクトに取り組んでいます。Visual Studio の事前定義されたログイン関数には、ユーザー名とパスワードでユーザーを取得するために使用される FindAsync という名前の関数があります。私の場合、同じユーザー名とパスワードを持つ複数のユーザーが存在する可能性がありますが、それらは異なる会社に属します。最善のアプローチを知りたいです。FindAsync 関数 (および必要に応じて他の関数) をオーバーライドして別のパラメーターを追加する必要がありますか、または Identity を使用せずにユーザーとロールの管理を自分で実装する必要がありますか? または、別のより良い解決策はありますか?

UserManager のソース コードはまだ公開されていないため、関数をオーバーライドすることが最善の解決策であるとすれば、どうすればよいかわかりません。

以下に、私のモデルからのログイン機能とテイクアウトを示します。

    public async Task<ActionResult> Login(Login model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            var user = await UserManager.FindAsync(model.UserName, model.Password);
            if (user != null)
            {
                await SignInAsync(user, model.RememberMe);
                return RedirectToLocal(returnUrl);
            }
            else
            {
                ModelState.AddModelError("", "Invalid username or password.");
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

public class Company
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    public virtual ICollection<User> Users { get; set; }
    public virtual ICollection<Role> Roles { get; set; }
}

public class User : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    [Required]
    public virtual int CompanyId { get; set; }
    [Required]
    public virtual Company Company { get; set; }
}

どんな助けでも大歓迎です!

4

3 に答える 3

2

UserManagerの独自の実装を作成し、次のようなメソッドを作成すると思いますFindByCompanyAsync(string userName, string password, string companyName)

この方法では、UserManager のすべてのユーザーを取得してユーザーを検索し、LINQ 式を使用してユーザー名と会社名でフィルター処理できます。

于 2014-05-02T15:36:12.233 に答える
0

私と同じ問題に対処するこのスレッドを見つけました: ASP.NET ID を使用してマルチテナント ユーザー ログインを実装する方法

これは良いアプローチのように思えます。彼が行ったように、UserStore の独自の実装を作成してみます。

于 2014-05-16T16:01:52.157 に答える
0

companyId を UserStore に送信し、FindByNameAsync 関数をオーバーライドして、userName と companyId の両方をフィルター処理しました。私が気に入らないのは、プライベートであるため GetUserAggregateAsync 関数を使用できなかったことです。私のソリューションに他の欠点はありますか?

public class UserStore : UserStore<User>
{
    public int companyId = -1;

    public UserStore(DbContext context, int companyId)
        : base(context)
    {
        this.companyId = companyId;
    }

    public override Task<User> FindByNameAsync(string userName)
    {
        if (companyId < 0)
        {
            throw new Exception("There is no companyId associated with the UserStore.");
        }
        return QueryableExtensions.FirstOrDefaultAsync<User>(QueryableExtensions.Include<User, ICollection<IdentityUserLogin>>(QueryableExtensions.Include<User, ICollection<IdentityUserClaim>>(QueryableExtensions.Include<User, ICollection<IdentityUserRole>>(this.Users, (User u) => u.Roles), (User u) => u.Claims), (User u) => u.Logins), (User u) => u.UserName.ToUpper() == userName.ToUpper() && u.CustomerId == this.companyId);
    }
}
于 2014-05-18T15:13:33.120 に答える