私のコントローラー クラスは、アクションを保護するために AuthorizeAttribute で装飾されています。
[Authorize(Roles = "User Level 2")]
public class BuyController : Controller
{
...
}
アクションが呼び出されても、ユーザーが少なくとも「ユーザー レベル 2」のロールに属していない場合、ユーザーは次のような URL を持つログイン ページに自動的にリダイレクトされます。
http://localhost:1436/Account/Login?ReturnUrl=%2f購入
ユーザーがすでにログインしているが、適切なセキュリティ レベルを持っていない場合、これは最適な動作ではありません。ログイン ページを表示するのではなく、不足しているレベルについてユーザーに通知するページを表示する方が理にかなっています。
この動作をカスタマイズするにはどうすればよいですか?
必要なユーザー レベルを何らかの方法でログイン アクションに渡すことは可能ですか?
ベストアンサー1
次のようにして独自の承認属性を構築できます。
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 に追加することもできますが、私はそれを試していません。
編集AuthorizationContext.Cancel は RC にはもう存在しません。「filterContext.Result is HttpUnauthorizedResult」で十分なようです:filterContext.Cancel に何が起こったか (ASP.NET MVC)