ASP.NET MVC3: пользовательский атрибут [authorize] - PullRequest
3 голосов
/ 19 января 2012

В моей базе данных у пользователя системы есть список модулей, к которым он / она может обращаться.

Я хотел бы иметь возможность добавить атрибут авторизации, который проверяет, что это так.

например. [authorise(UserID, ControllerName)]

Что касается некоторого кода, гарантирует, что пользователь с указанным идентификатором пользователя имеет имя контроллера в своем списке.

На данный момент вы можете просто обойти тот факт, что вкладки не видны, используя URL. (У меня есть код, который уже проверяет, указал ли пользователь доступ и скрывает / показывает вкладки)

Ответы [ 3 ]

7 голосов
/ 19 января 2012
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 голос
/ 19 января 2012

Вы можете создать новый атрибут.

[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 */);
        }
    }

}
0 голосов
/ 19 января 2012

Когда вы создаете модель, проверьте разрешение

DisplayAdminLink = _permissionService.Authorize(StandardPermissionProvider.AccessAdminPanel),

и в представлении

    @if (Model.DisplayAdminLink)
    {
        <li><a href="@Url.Content("~/admin")" class="ico-admin">@T("Account.Administration")</a>
        </li>
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...