Могу ли я программно проверить, авторизован ли пользователь для данного метода контроллера? - PullRequest
0 голосов
/ 21 мая 2018

[Обратите внимание, что этот вопрос касается DotNet Core 1.1]

У меня есть метод контроллера в моем классе ItemsController, описанный ниже, чтобы ограничить возможность доступа к методу для пользователей в группе администраторов:

    [Authorize(Roles = @"MYDOMAIN\ThisApplicationAdmins")]
    [HttpDelete("/items/{itemsName}")]
    public ActionResult DeleteItem(string itemName)
    {
        // Dangerous code here.
    }

Это работает правильно.

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

Существует ли способ запросить ядро ​​ASP DotNet, чтобы спросить "Имеет ли пользователь X право доступа к методу ItemsController.DeleteItem()?"и ответили на этот вопрос тем же промежуточным программным обеспечением, которое отвечает за обработку атрибута?

1 Ответ

0 голосов
/ 04 июля 2018

Да, U может проверить на среднем уровне между пользовательским интерфейсом и контроллером, имеет ли конкретный пользователь доступ к запрошенному контроллеру или нет.

/ Нам нужно добавить где-нибудь в ур. Вид ниже асинхронного метода /

@if (await Url.HasAccessToController(urlActionContext))
{
    <p>You have access</p>
}

Реализация метода: -

public static async Task<bool> HasAccess(this IUrlHelper Helper, UrlActionContext ActionContext, string httpMethod = "GET" )
{
//U need to Implement this method as per your needs

    var httpContext = Helper.ActionContext.HttpContext;

    var routeValues = new RouteValueDictionary(ActionContext.Values);
    routeValues["action"] = ActionContext.Action;
    routeValues["controller"] = ActionContext.Controller;          

    var path = Helper.Action(ActionContext);

    var features = new FeatureCollection();
    features.Set<IHttpRequestFeature>(new HttpRequestFeature()
    {
        Method = httpMethod, 
        Path = path,

    });

    var ctx = new DefaultHttpContext(features);      

    var routeContext = new RouteContext(ctx);

    foreach (var entry in routeValues)
    {
        routeContext.RouteData.Values.Add(entry.Key, entry.Value);
    }

    var actionSelector = httpContext.RequestServices.GetRequiredService<IActionSelector>();

    var provider = httpContext.RequestServices.GetRequiredService<IActionDescriptorCollectionProvider>();       
    var actionDescriptors = actionSelector.SelectCandidates(routeContext);

    var actionDescriptor = actionSelector.SelectBestCandidate(routeContext, actionDescriptors);

    var authService = httpContext.RequestServices.GetRequiredService<IAuthorizationService>();

    var ok = await authService.AuthorizeAsync(httpContext.User, actionDescriptor, "YOUR_POLICY"); 

    return ok;

}
...