このスレッドをフォローアップすると、これが私が思いついたものです...
public class SharweAuthorizeAttribute : AuthorizeAttribute
{
private bool isAuthenticated = false;
private bool isAuthorized = false;
public new string[] Roles { get; set; }
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (SessionManager.CheckSession(SessionKeys.User) == true)
{
isAuthenticated = true;
foreach (string role in Roles)
{
if (RolesService.HasRole((string)role))
isAuthorized = true;
}
}
return (isAuthenticated && isAuthorized);
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (!isAuthenticated)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{ "action", "User" },
{ "controller", "Login" }
});
} else if(!isAuthorized) {
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{ "action", "Home" },
{ "controller", "Error" }
});
}
}
}
どのように/なぜ私はこれを思いついたのですか? AuthorizeAttribute ワークフローは次のようになると思います。
- まず、AuthorizeCore がトリガーされます。true が返された場合、ユーザーは承認されています。false を返す場合、HandleUnauthorizedRequest がトリガーされます。そうですか?
new
プロパティをオーバーライドするにはキーワードを使用する必要があることをどこかで読みました。したがって、これが私が Roles プロパティをオーバーライドした方法です。しかし、オーバーライドするプロパティが最初のプロパティ (基底クラスのもの) とは異なるタイプだった場合、それもそれを隠したり、まったく別のプロパティを作成したりしますか?
それで、あなたはどう思いますか?それは実際に機能するはずですか?UI をセットアップしていないため (デザイナーがデザインを完成させるのを待っているため)、今はテストできません... 実際、TDD の利点を理解するのはこれが初めてです。愚かで役に立たないが、私は間違っていた:)
PS:このスレッドでは、@tvanfosson がコンテキストの CachePolicy を設定しています (私はそう思います)。
前もって感謝します。