假设我有一个具有两个操作的控制器,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提供角色信息。如果有其他方法可以确定,我洗耳恭听
不知道这是否会有帮助,它可能被认为是一个不好的做法,但我之前所做的是创建一个自定义的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;
}
}