動的ロール割り当て用に次のカスタマイズ クラスがあります。
public class DynamicAuthorizeAttribute : AuthorizeAttribute
{
IVRControlPanelRepository repository = new IVRControlPanelRepository();
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var controllerName = httpContext.Request.RequestContext.RouteData.Values["controller"];
var actionName = httpContext.Request.RequestContext.RouteData.Values["action"];
string controller = controllerName.ToString() + "Controller";
string action = actionName.ToString();
repository.GetAssignRole(controller, action);
GetRolesFromDatabase(controllerName, actionName);
// Roles = "Role1,Role2,Role3";
Roles = repository.GetAssignRole(controller, action);
return base.AuthorizeCore(httpContext);
}
}
以下は、コンマで区切られたロールの文字列を返す関数です
public string GetAssignRole(string controllername, string actionname)
{
using (AppEntities db = new AppEntities())
{
var result = from u in db.AssignRoles where (u.ControllerName == controllername && u.ActionName == actionname) select u;
if (result.Count() != 0)
{
var rol = result.FirstOrDefault();
return rol.Role;
}
else
{
return "";
}
}
}
[DynamicAuthorizeAttribute]
すべてのコントローラーのすべてのアクションに属性を配置しました。
問題:
GetAssignRole() から返された Roles が空の場合、LogOn にリダイレクトされます。Roles=""
しかし、実際には、上記のコードの場合、アクションへの不正アクセスとして割り当てたいと考えています。Roles="Administrator,Member" の場合、ロールが GetAssignRole() から返された空の文字列である場合、匿名ユーザーまたは任意のユーザーによるアクションにアクセスするために、上記の関数で変更する必要があるものは適切に機能します。