2012-03-09 123 views
0

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

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

也忘记提及,在Admin区域,他们可以将素材上传到他们管理的网站,即比他们目前所在的网站更多。我有一个数据库,用于保存他们管理的网站。该URL会像/ Admin/Site /,但一旦他们登录到管理员,我如何确保他们不能去/ Admin/Site2,其中Site2是他们不是管理员。

+0

您需要使用角色。 [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

回答

1

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

    } 
} 
+0

因此,举例来说,除了要求提供详细信息的页面外,我还会在新闻区域内的所有内容上使用[CheckEmailAddress] – ediblecode 2012-03-09 10:50:40

+0

此外,在这个例子中,他们所要做的就是进入页面并设置cookie。他们可以重定向到页面,然后简单地向后导航,然后他们拥有cookie。 – ediblecode 2012-03-09 11:03:30

+0

查看我的更新。不应该在属性中设置Cookie。 – bloudraak 2012-03-09 11:14:38