多个授权请求

时间:2012-03-09 10:19:29

标签: c# asp.net-mvc asp.net-mvc-3 razor

我对MVC很陌生,甚至还没有真正掌握[Authorize]。基本上,我有一个网站,在一个区域,要求他们在访问之前提供他们的电子邮件地址,姓名和公司。没有密码,没有注册等。然后会有一个Admin区域,用户需要使用他们的电子邮件地址和密码登录。

我的问题是,我如何实施双重授权情况?

同样忘了提及在Admin区域内,他们可以将资料上传到他们管理的网站,即超过他们当前所在的网站。我有一个数据库,可以保存他们管理的网站。这个网址就像是/ Admin / Site /,但是一旦他们登录到管理员,我怎样才能确保他们不能去/ Admin / Site2 Site2是他们不是管理员的人。

1 个答案:

答案 0 :(得分:1)

我假设此人可以匿名并下载该文件,只要她/他之前提供了详细信息。在这种情况下,请忽略Authorization属性并编写自己的属性。这是一个简单的例子。它依赖于设置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
        }

    }
}