2012-03-22 58 views
2

我正在構建一個ASP.NET MVC應用程序,該應用程序將允許用戶根據他們的選擇連接到幾個數據庫之一(具有相同的模式)。用戶將在登錄前選擇一個數據庫,然後根據該數據庫進行身份驗證。授權屬性與多個角色提供者

我已經添加了幾個角色提供程序到web.config中,每個角色提供程序都有與每個可用數據庫對應的不同連接字符串。

我明白,我可以用Roles.providers收集訪問角色提供,但我不明白我怎麼能選擇哪個角色提供的是用戶通過[授權]屬性我控制器

我控制器看起來像這樣:

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!=「InsufficientPrivileges」?否則,重定向循環。什麼是匿名角色?匿名? – Mzn 2015-04-12 06:32:00

+1

'!='的好處。它已被糾正。是的,「anon」是「匿名的」。我不記得我爲什麼包括這個(我3年前回答了!)。 – 2015-04-12 15:38:48