ASP.Net MVC Путь к учетной записи - PullRequest
0 голосов
/ 02 марта 2011

Мне нужно создать приложение asvnet mvc, которое будет иметь следующую проверку http://domain.com/accounta/controller/view/id, эта учетная запись должна быть проверена после проверки базы данных, и если она должна продолжаться в URL, в противном случае клиент будет перенаправленна странице несуществующей учетной записи, проблема, которую я обнаружил, заключается в том, что в каждом методе контроллера я должен быть проверен?Для этого есть более мирное?

ex:

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

Ответы [ 2 ]

2 голосов
/ 02 марта 2011

Вы можете использовать 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);
}
1 голос
/ 06 марта 2012

Я бы начал с маршрутизации - вы должны научить механизм маршрутизации распознавать учетную запись в 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 и перенаправляет на страницу входа, если она пуста.Вы можете изменить URL перенаправления на все, что вам нужно.

Этот фильтр может применяться глобально (что, вероятно, не то, что вам нужно), к определенному действию или целому контроллеру.

Надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...