4

U には ASP.Net MVC 5 Web サイトがあり、現在のユーザーのロール (存在する場合) を取得し、それに応じて行動したいと考えています。テンプレートの VS 2013 のベータ版の後でも、いくつかの変更に気付きました。私は現在このコードを使用しています:

    //in Utilities.cs class
    public static IList<string> GetUserRoles(string id)
    {
        if (id == null)
            return null;

        var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new AppContext()));
        return UserManager.GetRoles(id);
    }

    //and I call it like this:
    var roles = Utilities.GetUserRoles(User.Identity.GetUserId());

これは最善のアプローチですか?そうでない場合、何ですか?

編集:

これを使用してロールを作成し、ユーザーをロールに追加しています。

RoleManager.Create(new IdentityRole("admin"));
if (um.Create(user, password).Succeeded)
{
   UserManager.AddToRole(user.Id, role);
}
4

1 に答える 1

1

それは機能するはずですが、1.1-alpha1 ビットでは、ミドルウェアと拡張メソッドを追加したので、UserManager はリクエストごとに 1 回作成され、再利用できます。そのため、アプリ コードで新しい UserManager を作成する代わりに、あなたは呼び出すことができます:

owinContext.GetUserManager<UserManager<MyUser>>() 

異なる db コンテキストを作成していないため、エンティティの同じインスタンスを取得することも保証されます。

ナイトリー 1.1 アルファ ビットに更新する場合、これを Startup.Auth.cs の先頭に追加して、userManager を作成する新しいミドルウェアを登録する必要があります。

        // Configure the UserManager
        app.UseUserManagerFactory(new UserManagerOptions<ApplicationUser>()
        {
            AllowOnlyAlphanumericUserNames = false,
            RequireUniqueEmail = true,
            DataProtectionProvider = app.GetDataProtectionProvider(),
            Provider = new UserManagerProvider<ApplicationUser>()
            {
                OnCreateStore = () => new UserStore<ApplicationUser>(new ApplicationDbContext())
            }
        });

次に、 AccountController を変更してコンテキストから取得できます。

    private UserManager<ApplicationUser> _userManager;
    public UserManager<ApplicationUser> UserManager {
        get
        {
            return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUser>();
        }
        private set
        {
            _userManager = value;
        }
    }
于 2013-11-18T21:15:59.240 に答える