【问题标题】:Given a URL and HTTP verb, how can I resolve the controller/action in ASP.NET MVC/Web API?给定 URL 和 HTTP 动词,我如何解析 ASP.NET MVC/Web API 中的控制器/操作?
【发布时间】:2015-07-22 21:02:43
【问题描述】:

假设我有一个具有两个操作的控制器,RouteOne (GET) 和 RouteTwo (POST)。我还注册了默认路由,所以如果控制器是 HomeController,我应该能够通过在浏览器中访问此 URL 来访问控制器:

回家/RouteOne

问题:给定一个 URL 和一个 HTTP 动词,我如何获得对我试图运行的控制器操作的 MethodInfo 的引用?这包括使用查询字符串参数的操作。

示例:HomeController 内部的此操作:

[HttpGet] public ActionResult AnAction(string param1, int param2) {}

应该使用 GET 的 HTTP 动词和以下的 URL 解析:

首页/AnAction?param1=asdf&param2=1234

最终目标是确定某人是否有权访问给定的 URL,使用 AuthorizeAttribute 提供角色信息。如果有其他方法可以确定这一点,我会全力以赴。

【问题讨论】:

  • 为什么需要methodinfo来告诉你?您是否尝试对 Authorize 属性进行单元测试?
  • 您是否尝试在客户端确定权限?当服务器拒绝他们的请求时,用户可以告诉他们没有访问权限。让您的 api 返回 403 禁止代码。
  • 这已经通过属性内置了,但是如果您试图隐藏链接,最好设置用户拥有和不拥有的权限,将它们存储为声明(在用户身份对象中),然后在 UI 中检查声明。

标签: c# asp.net asp.net-mvc asp.net-web-api


【解决方案1】:

不知道这是否会有所帮助,它可能被认为是一种不好的做法,但我之前所做的是创建一个自定义 AuthorizeAttribute 并用它装饰相关的操作以确定是否登录用户被授权访问该操作,如果没有重定向到主页。也许这可以给你一些想法。

public class RoleAuthorize : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        UrlHelper urlHelper = new UrlHelper(filterContext.RequestContext);
        filterContext.Result = new RedirectResult(urlHelper.Action("Index", "Authentication"));
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var permission = httpContext.Request.RequestContext.RouteData.GetRequiredString("controller");
        var user = httpContext.User.Identity.IsAuthenticated == true ? ((MyUserIdentity)httpContext.User.Identity) : null;

        if (user == null)
            return false;

        if (permission.Equals("Home"))
            return true;

        int count = 0;
        using (var con = new myAppEntities())
        {
            var permissionid = con.permissions.Where(p => p.PermissionName.Equals(permission)).Single().PermissionId;
            count = con.rolepermissions.Where(rp => rp.PermissionId == permissionid && rp.RoleId == user.RoleId).Count();
        }

        if (count > 0)
            return true;
        else
            return false;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-06
    • 2019-02-06
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多