2012-03-22 20 views
2

私は、選択に応じて(同じスキーマを使用して)複数のデータベースのうちの1つに接続できるようにするASP.NET MVC Appを構築しています。ユーザーはログインする前にデータベースを選択し、そのデータベースに対して認証されます。複数のロールプロバイダを持つ属性の承認

私はweb.configにいくつかのロールプロバイダを追加しました。それぞれは利用可能なデータベースのそれぞれに対応する異なる接続文字列を持ちます。

私はRoles.providersコレクションとロールプロバイダにアクセスすることができますが、私は、私はプロバイダが私のコントローラで[承認]属性によって、ユーザ

私のコントローラされている役割を選択することができますどのように理解していないことを理解し

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

これは、デフォルトロールプロバイダに対してユーザーロールをチェックすると仮定します。 [Authorize]属性に使用するロールプロバイダを実行時にどのように選択できますか?

答えて

1

私が知る限り、あなたが示唆していることをする方法はありません。属性は、実行時には変更できない静的メタデータです。

[Authorize] 
public class AdminController : Controller { 

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

あなたのコントローラ内のすべてのアクションのために、この動作を持つようにしたい場合は、次のことができます。ユーザーが適切な役割を持っていない場合しかし、それはあまり便利だにも関わらず、あなたはリダイレクトすることによって、あなたが望むものを達成することができます私はそれが役に立てば幸い

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

OnActionExecutingメソッドをオーバーライドします。

+0

filterContext.ActionDescriptor.ActionName!= "InsufficientPrivileges"?さもなければリダイレクトループ。 anonの役割は何ですか?匿名? – Mzn

+1

'!='をうまくキャッチします。それは修正されました。はい、「anon」は「匿名」です。私はなぜそれを含めたのか覚えていない(私はこれを3年前に答えた!)。 –

関連する問題