我可以以编程方式检查用户是否有权使用给定的控制器方法吗?

时间:2018-05-21 14:25:05

标签: asp.net-core authorization asp.net-core-1.1 authorize-attribute

[请注意这个问题是关于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 :(得分:0)

是的,U可以在UI和控制器之间的中间级别检查特定用户是否有权访问请求的控制器。

/ 我们需要在异步方法下的ur View中添加一个地方 /

@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;

}