Каков наилучший способ сохранить доступ к ApplicationUserManager после удаления контроллера?

Вчера столкнулся с интересной проблемой. Только мой веб-сайт MVC с Identity 1 я использовал IPrincipal метод расширения для выполнения пользовательской аутентификации, который отлично работал во всех видах бритвы, где это было необходимо. Теперь с Identity 2 мне нужно получить доступ в методе расширения к ApplicationUserManagerпоэтому я был вынужден передать HttpContext.Current сквозь все взгляды.

Это прекрасно работает, кроме внутренней бритвы @section разделы - после стека вызовов кажется, что они не будут обработаны до тех пор, пока не будет удален контроллер, который избавляется от моей базы данных и менеджеров пользователей и т. д.

Как лучше всего обойти это ограничение? Я хочу продолжать использовать разделы, так как они позволяют мне легко вводить javascript в самый конец html, но я также хочу продолжать использовать расширения бритвы внутри этих разделов, поскольку они являются очень хорошим и простым способом управления тем, что выводится в стр.

На данный момент я вынужден создать новый ApplicationUserManager а также MyDbContextзасунь их в ViewBag а затем передать их в расширение, которое не идеально.

Пример моего метода расширения:

public static bool HasPermission(this IPrincipal source, ApplicationUserManager um, MyDbContext db, string controller, string method) {
        if (!source.Identity.IsAuthenticated) {
            return false;
        }

        var roles = um.GetRoles(source.Identity.GetUserId());
        if (roles.Count == 0) {
            return false;
        }

        // Admins have global access
        string role = roles[0];
        if (role.Equals("Admin")) {
            return true;
        }
        // This is fine being un-domained, permissions are global
        PermissionMatrix permission = db.PermissionMatrices.FirstOrDefault(x => x.Controller == controller && x.Action == method && x.RoleName == role);
        return permission != null;
    }

Пример того, где он используется:

@if (User.HasPermission((ApplicationUserManager)ViewBag.UserManager, (MyDbContext)ViewBag.Database, "Event", "Create")) {
    @Html.ActionLink("Create New", "Create")
}

Редактирование, чтобы сделать саму проблему более ясной:

Это был метод расширения, прежде чем я взломал свой хак -

public static bool HasPermission(this IPrincipal source, HttpContext context, string controller, string method) {
    var userManager = context.GetOwinContext().Get<ApplicationUserManager>();
    var myDb = context.GetOwinContext().Get<MyDbContext>();

Как я уже сказал выше, это работает (пропуская HttpContext.Current через страницу.cshtml), ЕСЛИ БЕЗ вызова внутри бритвы @section, тогда это терпит неудачу, потому что они запускаются ПОСЛЕ того, как был удален контроллер, который удаляет содержимое внутри OwinContext.

Приведенный выше код - хакерский способ, которым я сейчас пользуюсь; в моих контроллерах я должен создать дополнительный MyDbContext и дополнительный ApplicationUserManager.

0 ответов

Другие вопросы по тегам