Авторизовать атрибут с несколькими поставщиками ролей - PullRequest
2 голосов
/ 22 марта 2012

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

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

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

Мои контроллеры выглядят примерно так:

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

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

1 Ответ

1 голос
/ 23 марта 2012

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

[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" );
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...