ASP.NET MVC 中的自定义 CustomAuthenticationAttribute 依赖参数

问题描述

我如何为 ASP.NET MVC 5 中的动作创建 CustomAuthenticationAttribute 依赖参数,我的意思是如果我发送到模块 5,这意味着获取数据相关的老师,如果我发送 3 作为模块中的参数,回学生。我想添加两个权限(学生和教师)以允许用户访问学生或教师或两者。

[CustomAuthentication(PermissionCode = "Student_View")]
public ActionResult Index(int module)
{
}

我有问题,因为 CustomAuthentication 相关页面代码(我将添加两段代码)student_View 和 Teacher_View

解决方法

我相信您仍然可以使用传入的 AuthorizationContext 访问操作参数,具体取决于您的属性设置方式,执行类似于 this 的操作。我是从 AuthorizeAttribute 继承的,但只要您可以访问 Request 对象,这应该适用于其他类型的属性。

您还可以通过将 "module" 属性名称传递给属性来使其动态化:

public class CustomAuthenticationAttribute : AuthorizeAttribute {
    public string ParamName { get; set; }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
        if (!string.IsNullOrEmpty(ParamName)) {
            if (filterContext.RequestContext.HttpContext.Request.QueryString[ParamName] != null) { // If using GET
                int module = int.Parse(filterContext.RequestContext.HttpContext.Request.QueryString[ParamName]);

                // Do something with module
            } else if (filterContext.RequestContext.HttpContext.Request.Form[ParamName] != null) { // If using POST (I have not tested Form before myself)
                int module = int.Parse(filterContext.RequestContext.HttpContext.Request.Form[ParamName]);

                // Do something with module
            }
        }
    }
}

然后你会像这样使用它:

[CustomAuthentication(ParamName = "module")]
public ActionResult Index(int module) { }