26

私の Controller クラスは、アクションを保護するために AuthorizeAttribute で装飾されています。

[Authorize(Roles = "User Level 2")]
public class BuyController : Controller
{
    ...
}

アクションが呼び出されたが、ユーザーが「ユーザー レベル 2」以上のロールに属していない場合はいつでも、ユーザーは次のような URL を持つログイン ページに自動的にリダイレクトされます。

http://localhost:1436/Account/Login?ReturnUrl=%2fBuy

ユーザーがすでにログインしていても、適切なセキュリティ レベルを持っていない場合、これは最適な動作ではありません。ログインページを表示する代わりに、不足しているレベルについてユーザーに通知するページを表示する方が理にかなっています。

この動作をカスタマイズするにはどうすればよいですか?

必要なユーザー レベルを Login アクションに渡すことはできますか?

4

2 に答える 2

38

次のように独自の authorize 属性を作成できます。

public class ClubAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
  base.OnAuthorization(filterContext);
  if (filterContext.Cancel && filterContext.Result is HttpUnauthorizedResult)
  {
    filterContext.Result = new RedirectToRouteResult(
      new RouteValueDictionary {
      { "clubShortName", filterContext.RouteData.Values[ "clubShortName" ] },
      { "controller", "Account" },
      { "action", "Login" },
      { "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
    });
  }
}
}

これを使用して、構築中のクラブ メンバーシップ サイトの特定のクラブにリダイレクトしました。これを必要に応じて調整できます。ところで、私の場合はログイン ページにリダイレクトしますが、ユーザーが承認されているかどうかを確認し、承認されている場合は、正しい権限がないというメッセージを表示します。ViewData または TempData に何かを追加してページに表示することもできることは間違いありませんが、試したことはありません

EDIT AuthorizationContext.Cancel は RC にはもう存在しません。「filterContext.Result is HttpUnauthorizedResult」で十分なようです: filterContext.Cancelに何が起こったのか(ASP.NET MVC)

于 2009-01-09T14:38:23.357 に答える