ASP.Net MVC路由到帐户

问题描述:

我需要创建一个aspnet mvc应用程序,它具有以下验证http://domain.com/accounta/controller/view/id,这个帐户必须在数据库验证一次,如果它应该继续在url中检查,否则客户将被重定向到一个不存在的帐户页面,我发现的问题是,在每个控制器方法中,我必须进行验证?有一个更和平的呢?ASP.Net MVC路由到帐户

例如:

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(); 
    } 

abovethe在控制器的每个方法的代码..

的Global.asax

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

您可以使用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); 
} 

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

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

您应该在之前在Global.asax中添加此代码“Default”路由。

然后,您需要找出在每个操作之前执行帐户验证逻辑的方法。您可以使用过滤器来实现此目的下面是你的情况的参考代码:

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路由值,并重定向到登录页面,如果是零。您可以将重定向网址更改为您需要的任何内容。

此过滤器可全局应用(这可能不是你所需要的),以具体行动或整个控制器。

希望有所帮助。