给定一个URL和HTTP动词,我如何解决控制器/动作在ASP.. NET MVC/Web API

本文关键字:控制器 解决 NET API Web MVC ASP 一个 URL HTTP 动词 | 更新日期: 2023-09-27 18:04:01

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

回家/RouteOne

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

示例:HomeController内部的动作:

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

应该用GET的HTTP动词和URL解析为:

家/一刻? param1 = asdf& param2 = 1234

最终目标是确定某人是否有权访问给定的URL,使用AuthorizeAttribute提供角色信息。如果有其他方法可以确定,我洗耳恭听

给定一个URL和HTTP动词,我如何解决控制器/动作在ASP.. NET MVC/Web API

不知道这是否会有帮助,它可能被认为是一个不好的做法,但我之前所做的是创建一个自定义的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;
    }
}
相关文章: