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路由值,并重定向到登录页面,如果是零。您可以将重定向网址更改为您需要的任何内容。
此过滤器可全局应用(这可能不是你所需要的),以具体行动或整个控制器。
希望有所帮助。