我假设这个人可以是匿名的,只要她/他提供了详细信息之前下载该文件。在这种情况下,请忽略授权属性并编写您自己的。这是一个简单的例子。它依靠一个cookie来设置。
public class CheckEmailAddressAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var request = filterContext.HttpContext.Request;
// if the cookie isn't set the a user never provided their details
if (request.Cookies["mycookiename"] == null)
{
// Set it to the correct result, to redirect the user to provide their email address
filterContext.Result = new ViewResult { ViewName = "GetEmailAddress" };
filterContext.HttpContext.Response.AppendCookie(new HttpCookie("mycookiename", "true"));
}
else
{
// Don't do anything, the user already provided their email address
}
}
}
并在下载的控制器上指定它。
public class DownloadController : Controller
{
[CheckEmailAddress]
public ActionResult Download(string name)
{
// Implement download
}
}
剩下的唯一事情就是在设置电子邮件地址时设置cookie。我假设你知道如何做到这一点。您可能还需要确保您有一些“returnUrl”参数,以便您可以在用户提供其电子邮件地址后将用户重定向到下载页面。
编辑
按OP,我们不想设置Cookie,除非该人进入他们的详细资料,所以这里是更新后的类。
public class CheckEmailAddressAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var request = filterContext.HttpContext.Request;
// if the cookie isn't set the a user never provided their details
if (request.Cookies["mycookiename"] == null)
{
// Set it to the correct result, to redirect the user to provide their email address
filterContext.Result = new ViewResult { ViewName = "GetEmailAddress" };
// filterContext.HttpContext.Response.AppendCookie(new HttpCookie("mycookiename", "true"));
}
else
{
// Don't do anything, the user already provided their email address
}
}
}
您需要使用角色。 [http://stackoverflow.com/questions/6404254/mvc-3-dynamic-authorization-of-multiple-roles-and-users][1] [1]:HTTP://计算器。 com/questions/6404254/mvc-3-dynamic-authorization-of-multiple-roles-and-users – 2012-03-09 10:23:24