在我的数据库中,系统用户有一个他/她可以访问的模块列表。
我希望能够添加一个authorize属性来检查是否属实。
E.g。 [authorise(UserID, ControllerName)]
某些代码,确保指定了UserID的用户在其列表中具有控制器名称。
目前,您可以通过使用URL简单地绕过标签不可见的事实。 (我的代码已经检查用户是否已指定访问权限并隐藏/显示标签)
答案 0 :(得分:7)
public class MyAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var isAuthorized = base.AuthorizeCore(httpContext);
if (!isAuthorized)
{
return false;
}
string currentUser = httpContext.User.Identity.Name;
string currentController = httpContext.Request.RequestContext.RouteData.GetRequiredString("controller");
// TODO: go hit your database and see if currentUser can access
// currentController and return true/false from here
...
}
}
然后装饰你的控制器或动作:
[MyAuthorize]
public class FooController: Controller
{
...
}
据说我怀疑你可能在数据库设计中走错了方法,存储了哪个用户有权访问哪个控制器操作的列表。可能你应该使用角色。让数据库了解控制器只是感觉不对。
所以:
[Authorize(Roles = "Foo,Bar")]
public class FooController: Controller
{
...
}
只有具有Foo
或Bar
角色的用户才能访问FooController
。
答案 1 :(得分:1)
您可以创建新属性。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class CustomAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.Result = new HttpUnauthorizedResult();
}
bool authorized = // Perform custom logic
If(!authorized)
{
filterContext.Result = new RedirectResult(/* Your access denied url */);
}
}
}
答案 2 :(得分:0)
创建模型时,请检查权限
DisplayAdminLink = _permissionService.Authorize(StandardPermissionProvider.AccessAdminPanel),
并在视图中
@if (Model.DisplayAdminLink)
{
<li><a href="@Url.Content("~/admin")" class="ico-admin">@T("Account.Administration")</a>
</li>
}