【问题标题】:ASP.Net MVC Route to AccountASP.Net MVC 路由到帐户
【发布时间】:2011-03-02 11:42:49
【问题描述】:

我需要创建一个具有以下验证 http://domain.com/accounta/controller/view/id 的 aspnet mvc 应用程序,必须在数据库中验证此帐户后检查它是否应该在 url 中继续,否则客户将被重定向到不存在帐户的页面,我发现的问题是在每个控制器方法中我都必须经过验证?有更平安的吗?

例如:

public ActionResult Index()
    {
        if ((host != null) && (host.IndexOf(".") < 0))
        {
            sessao = SessionController.GetInstance();
            if (sessao.Conta.dsHost != null)
            {
                return View(sessao.Conta);
            }
            else
            {
                using (var contexto = new ThalentoEntities())
                {
                    sessao.Conta = contexto.TH_Conta.Single(q => q.dsHost == host && q.flAtivo == true);
                    if (sessao.Conta.dsHost != null)
                        return View(sessao.Conta);
                    else
                        return Redirect("/erro/no_account");
                }
            }
        }
        else
        {
            return Redirect("/erro/no_account");
        }
        return View();
    }

以上是控制器中各个方法的代码..

以及下面global.asax的代码

routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { host= UrlParameter.Optional, controller = "principal", action = "index", id = UrlParameter.Optional } 
        );  

【问题讨论】:

    标签: asp.net-mvc model-view-controller asp.net-mvc-3


    【解决方案1】:

    您可以使用AuthorizeAttribute。示例:

    public class CustomAuthorizeAttrinute : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);
    
            // override standard error result
            if (filterContext.Result is HttpUnauthorizedResult)
            {
                string url = "~/account/logon";
    
                if (filterContext.HttpContext.Request != null)
                    url += "?rb=" + filterContext.HttpContext.Request.RawUrl;
    
                if (LoginLib.IsLogged())
                    LoginLib.Logout();
    
                filterContext.Result = new RedirectResult(url);
            }
        }
    }
    
    public class AdminAuthorizeAttribute : CustomAuthorizeAttrinute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            return LoginLib.IsLogged<Admin>();
        }
    }
    

    然后在控制器中

    [AdminAuthorize]
    public ActionResult Index()
    {
        var model = new FooModel();
    
        model.Secret = "This is for admins only!";
    
        return View(model);
    }
    

    【讨论】:

      【解决方案2】:

      我将从路由开始 - 你应该教路由引擎识别 url 中的帐户,方法如下:

      routes.MapRoute(
              "AccountUrl",
              "{account_name}/{controller}/{action}/{id}",
              new { host= UrlParameter.Optional, account_name = "", controller = "principal", action = "index", id = UrlParameter.Optional } 
          ); 
      

      您应该在 Global.asax 中的“默认”路由之前添加此代码

      然后,您需要想办法在每个操作之前执行帐户验证逻辑。您可以使用过滤器实现此目的。这是您案例的参考代码:

      public class ValidateAccountAttribute: FilterAttribute, IActionFilter {
          public void OnActionExecuting(ActionExecutingContext filterContext) {
              if (filterContext.RouteData.Values.ContainsKey("account_name") ||
                  !IsAccountExists((string)filterContext.RouteData.Values["account_name"]))
                  filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new {controller = "account", action = "login"}));
          }
      
          private bool IsAccountExists(string accountName) {
              // TODO: Implement
              throw new NotImplementedException();
          }
      
          public void OnActionExecuted(ActionExecutedContext filterContext) {
          }
      }
      

      它只是验证 account_name 路由值,如果它为空则重定向到登录页面。您可以将重定向网址更改为您需要的任何内容。

      此过滤器可以全局应用(这可能不是您需要的),应用于特定操作或整个控制器。

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2016-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多