我正在构建一个ASP.NET MVC应用程序,它允许用户根据其选择连接到多个数据库之一(具有相同的模式)。用户将在登录前选择一个数据库,然后针对该数据库进行身份验证。
我已经为web.config添加了几个角色提供程序,每个角色提供程序都有一个与每个可用数据库对应的不同连接字符串。
我知道我可以使用Roles.providers集合访问角色提供程序,但我不明白如何通过控制器中的[Authorize]属性选择哪个角色提供程序是用户
我的控制器看起来像这样:
namespace MyApp.Controllers
{
[Authorize(Roles = "admin")]
public class AdminController : Controller
{
我认为这将检查用户角色与默认角色提供程序。 如何在运行时选择将哪个角色提供程序用于[Authorize]属性?
答案 0 :(得分: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" );
}
我希望有所帮助。