Каков наилучший способ сохранить доступ к 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.