管理者とパートナーの2種類の役割を持つASP.NETMVC4サイトがあります。
基本的に、サイトへのすべてのアクセスには、ユーザーが認証され、管理者の役割を持っている必要があります。したがって、これはFilterConfig.cs(Global.asaxから呼び出されます)で行います。
public class FilterConfig {
public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
filters.Add(new HandleErrorAttribute());
filters.Add(new AuthorizeAttribute { Roles = "Administrator" }); // default deny
}
}
ただし、1つのコントローラーについては、パートナーの役割を持ち、管理者の役割を持たないユーザーにアクセスを許可したいと思います。グローバルフィルターを使用せず、代わりに各コントローラーまたはアクションに承認属性を設定することでこれを実行できることはわかっていますが、代わりに、すべてのアクセスにデフォルトで「管理者」の役割が必要であり、何らかの形式のホワイトリストを使用するホワイトリストアプローチが必要です。 。
次のようにOnAuthorizationをオーバーライドするコントローラーを使用してみました。
public class MyController : Controller {
protected override void OnAuthorization(AuthorizationContext filterContext) {
if (User.Identity.IsAuthenticated) {
var attributes = new List<AllowRolesAttribute>();
attributes.AddRange(filterContext.ActionDescriptor.GetCustomAttributes(true).OfType<AllowRolesAttribute>());
attributes.AddRange(filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(true).OfType<AllowRolesAttribute>());
foreach (var authorizationAttribute in attributes) {
foreach (var role in authorizationAttribute.Roles.Split(',')) {
if (User.IsInRole(role))
return; // Skip authorization because user has one of the allowed roles.
}
}
}
base.OnAuthorization(filterContext);
}
}
次に、コントローラーを次のように定義します。
[AllowRoles(Roles = "Partner")]
public class HomeController : MyController
{
...
しかし、これは機能しません。「Partner」の役割を持つユーザーでこのコントローラーにアクセスすると、コードに従って内部のreturnステートメントを実行できますが、ユーザーは許可されずにログインページにリダイレクトされます。ここで何が欠けていますか?