2012-03-22 4 views
2

Я создаю приложение ASP.NET MVC, которое позволит пользователю подключаться к одной из нескольких баз данных (с той же схемой) в зависимости от их выбора. Пользователь выберет базу данных до входа в систему и затем будет аутентифицирован против этой базы данных.Авторизовать атрибут с несколькими поставщиками ролей

Я добавил несколько поставщиков роли в web.config, каждый из которых имеет другую строку соединения, соответствующую каждой из доступных баз данных.

Я понимаю, что я могу получить доступ к поставщикам ролей с коллекцией Roles.providers, но я не понимаю, как я могу выбрать, какую роль провайдера быть пользователь с помощью [Authorize] атрибутом в моих контроллерах

Моих контроллеров что-то вроде этого:

namespace MyApp.Controllers 
{ 
    [Authorize(Roles = "admin")] 
    public class AdminController : Controller 
    { 

Я предполагаю, что это проверит роль пользователей против поставщика роли по умолчанию. Как выбрать во время выполнения, какой поставщик роли будет использоваться для атрибута [Авторизовать]?

ответ

1

Насколько я знаю, нет способа сделать то, что вы предлагаете. Атрибуты - это статические метаданные, которые нельзя изменять во время выполнения. Однако, несмотря на то, что это менее удобно, вы можете сделать то, что вы хотите, перенаправляя, если пользователь не имеет соответствующую роль:

[Authorize] 
public class AdminController : Controller { 

    public ActionResult ActionRequiringRoleFoo() { 
    if(!User.IsInRole("foo")) return RedirectToAction("InsufficientPrivileges"); 
    return View(); 
    } 

Если вы хотите, чтобы это поведение для всех действий в контроллере, вы можете переопределить метод OnActionExecuting:

protected override void OnActionExecuting(ActionExecutingContext filterContext) { 
    base.OnActionExecuting(filterContext); 
    if(filterContext.ActionDescriptor.ActionName != "InsufficientPrivileges" && 
    !User.IsInRole("anon")) filterContext.Result = new RedirectResult("InsufficientPrivileges"); 
} 

Я надеюсь, что помогает.

+0

filterContext.ActionDescriptor.ActionName! = "InsfectPrivileges"? В противном случае цикл перенаправления. Какова роль анонов? Anonymous? – Mzn

+1

Хороший улов на '! ='. Это исправлено. Да, «anon» является «анонимным». Я не могу вспомнить, почему я включил это (я ответил это 3 года назад!). –

Смежные вопросы