2

我有使用 Visual Studio 2012 为 MVC 4 编写的代码......我正在尝试实现基于角色的授权,但似乎 [Authorize] 由于某种原因无法正常工作......而且我仍然可以通过 url 获取页面,甚至它的控制器动作是用 [Authorize] 属性初始化的......第二个我什至可以尝试通过将以下代码放入全局中来查看整个应用程序

 public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new System.Web.Mvc.AuthorizeAttribute());
        filters.Add(new HandleErrorAttribute());
    }

我的路由默认设置为登录页面,因为没有未经授权的人可以访问应用程序

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional }
        );
    }

我试图通过直接从 url 获取 aa() 视图来进行测试

[Authorize]
public class HomeController : Controller
{


    public ActionResult Index()
    {
        return View();
    }

    [Authorize]
    public ActionResult aa()
    {
        return View();
    }

登录代码

[Authorize]
[InitializeSimpleMembership]
public class AccountController : Controller
{


    public ActionResult Login(string returnUrl)
    {
        ViewBag.ReturnUrl = returnUrl;

        return View();
    }

    [HttpPost]

    public ActionResult Login(LoginModel model, string returnUrl)
    {

        if (ModelState.IsValid && WebSecurity.Login(model._UserName, model._Password, persistCookie: false))
        {
            return RedirectToAction("Index", "Home");                
        }

        ModelState.AddModelError("", "The user name or password provided is incorrect.");

        return View(model);
    }

和 web.config

 <authentication mode="Forms">
  <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
4

2 回答 2

0

InitializeSimpleMembership需要装饰你的 HomeController,而不是 AccountsController。由于您的 HomeController/Index 方法是整个网站的入口点,[Authorize因此要使 ] 工作,您需要先初始化 SimpleMembership,然后再进行其他任何操作。

于 2013-09-30T15:41:22.390 回答
0

我创建了新的 MVC4 网站并面临同样的问题:如何强制授权(如果未授权,则重定向到登录页面)。

我是 ASP.NET 的初学者,找不到简单的答案(这方面有很多,尤其是在 stackoverflow,但这些答案都没有帮助我)。几个小时后我终于完成了,所以也许我会帮助某人。

  1. 将过滤器添加到全局过滤器,这将需要在任何地方进行授权(除非您将设置 AllowAnonymous,但稍后再说)。打开 App_Start/FilterConfig.cs并:

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
            // Add this line
            filters.Add(new AuthorizeAttribute());
        }
    
  2. 现在我们需要在配置文件中设置授权。在项目的根目录中打开 Web.config并:

    <system.web>
    
        // start of modification
    
        // remove this line
        <authentication mode="None" />
    
        // add this lines
        <authentication mode="Forms">
            <forms loginUrl="~/Account/Login" timeout="30" protection="All"></forms>
        </authentication>
        <authorization>
            <deny users="?" />
        </authorization>
    
        // end of modification
    
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
    </system.web>
    

就这样。默认登录操作默认具有 [AllowAnonymous] 标签,因此它应该可以正常工作。如果您不需要在 Controllers/ 中手动添加它们,就像这样:

    [AllowAnonymous]
    public ActionResult Login(string returnUrl)
        {
            ViewBag.ReturnUrl = returnUrl;
            return View();
        }

希望帮助了某人。

于 2015-11-10T21:22:37.863 回答