[请注意这个问题是关于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()
?"并且由负责处理属性的相同中间件回答了这个问题吗?
答案 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;
}