C# 使用多个角色提供程序授权属性

C# 使用多个角色提供程序授权属性,c#,asp.net-mvc,C#,Asp.net Mvc,我正在构建一个ASP.NET MVC应用程序,它允许用户根据自己的选择连接到多个数据库中的一个(具有相同的模式)。用户将在登录之前选择一个数据库,然后根据该数据库进行身份验证 我在web.config中添加了几个角色提供程序,每个角色提供程序都具有与每个可用数据库对应的不同连接字符串 我知道我可以通过Roles.providers集合访问角色提供程序,但我不知道如何通过控制器中的[Authorize]属性选择哪个角色提供程序是用户 我的控制器如下所示: namespace MyApp.Contr

我正在构建一个ASP.NET MVC应用程序,它允许用户根据自己的选择连接到多个数据库中的一个(具有相同的模式)。用户将在登录之前选择一个数据库,然后根据该数据库进行身份验证

我在web.config中添加了几个角色提供程序,每个角色提供程序都具有与每个可用数据库对应的不同连接字符串

我知道我可以通过Roles.providers集合访问角色提供程序,但我不知道如何通过控制器中的[Authorize]属性选择哪个角色提供程序是用户

我的控制器如下所示:

namespace MyApp.Controllers
{
    [Authorize(Roles = "admin")]
    public class AdminController : Controller
    {
我假设这将对照默认角色提供程序检查用户角色。
我如何在运行时选择哪个角色提供程序将用于[授权]属性?

据我所知,没有办法按照您的建议执行。属性是在运行时无法更改的静态元数据。但是,即使不太方便,如果用户没有合适的角色,您也可以通过重定向来完成您想要的任务:

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

我希望这能有所帮助。

filterContext.ActionDescriptor.ActionName!=“特权不足”?否则将创建重定向循环。anon的角色是什么?匿名?很好地抓住了
=。已经纠正了。是,
anon
为“匿名”。我不记得我为什么要把它包括进去(我三年前回答过这个问题!)。