Расположение MVC 3 позволяет пользователям в web.config - PullRequest
0 голосов
/ 11 марта 2012

Я пытаюсь авторизоваться с помощью web.config.В моей регистрации пользователя он не использует конфигурацию ASP.NET.Я обрабатываю страницу входа с базой данных.Я хочу защитить страницу администратора как ручную ввод адреса от других людей.Я поместил этот код в Web.config.

//Web.config
<location path="Product">
<system.web>
  <authorization>
    <allow users="*"/>
  </authorization>
</system.web>

Когда администратор входит на веб-сайт с домашней страницы, на которой есть частичная страница входа, он получит userName и admin независимо от того, является ли он ложным или истинным по базе.

[HttpPost]
    public ActionResult Index(Customer model)
    {
        if (ModelState.IsValid)
        {
            //define user whether admin or customer
            SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["rentalDB"].ToString());
            String find_admin_query = "SELECT admin FROM Customer WHERE userName = '" + model.userName + "' AND admin ='true'";
            SqlCommand cmd = new SqlCommand(find_admin_query, conn);
            conn.Open();
            SqlDataReader sdr = cmd.ExecuteReader();
            //it defines admin which is true or false
            model.admin = sdr.HasRows;
            conn.Close();

            //if admin is logged in
            if (model.admin == true) {
                if (DAL.UserIsVaild(model.userName, model.password))
                {
                    FormsAuthentication.SetAuthCookie(model.userName, true);
                    return RedirectToAction("Index", "Product");
                }
            }

            //if customer is logged in
            if (model.admin == false) { 
                if (DAL.UserIsVaild(model.userName, model.password))
                {
                    FormsAuthentication.SetAuthCookie(model.userName, true);                   
                    return RedirectToAction("Index", "Home");
                }
            }
                ModelState.AddModelError("", "The user name or password is incorrect.");
        }
        // If we got this far, something failed, redisplay form
        return View(model);
    }

Тогда у меня вопрос, как я могу определить пользователя с помощью web.config вместо "*", например, используя model.userName или model.admin?Не могли бы вы сказать мне, как определить пользователей?спасибо.

Ответы [ 3 ]

2 голосов
/ 11 марта 2012

Во-первых, вы не можете использовать элемент authorization в web.config для защиты путей, как вы можете использовать для ASP.NET WebForms. Это связано с тем, что маршруты в MVC не являются физическими путями, как в WebForms.

Во-вторых, вы можете захотеть свернуть свои собственные MembershipProvider и RoleProvider, поскольку они будут хорошо интегрироваться с ASP.NET и MVC. это довольно тривиально, и вы можете заменить свой собственный DAL для выполнения контрактов с провайдером.

Вот как могут выглядеть ваши контроллеры после внедрения собственных провайдеров:

public class AuthController : Controller
{
    public ActionResult Index(Customer model)
    {
        if (ModelState.IsValid)
        {
            if (Membership.ValidateUser(model.userName, model.password))
            {
                if (Roles.IsUserInRole(model.userName, "admin")) return RedirectToAction("Index", "Product");

                return RedirectToAction("Index", "Home");
            }

            ModelState.AddModelError("", "The user name or password is incorrect.");
        }
        // If we got this far, something failed, redisplay form
        return View(model); 
    }
}

[Authorize(Roles = "user")]
public class HomeController : Controller
{

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

[Authorize(Roles = "admin")]
public class ProductController : Controller
{

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

Если вы не хотите создавать собственных провайдеров, есть два других варианта, чтобы получить ту же функциональность, что и украшения [Authorization]:

  1. Подпишитесь на событие AuthenticateRequest в вашем global.asax.cs, проверьте, чтобы свойство User.Identity.IsAuthenticated имело значение true (о чем оно сможет сказать вам по формам, где будет обработан тикет авторизации). для вас на данный момент). Если это так, загрузите свои роли из DAL и создайте новый объект членства, добавив роли, найденные в DAL. Теперь вы можете использовать AuthorizeAttribute где угодно.

  2. Создайте свой собственный производный AuthorizeAttribute, который использует ваш DAL для получения ролей пользователя.

2 голосов
/ 11 марта 2012

Из твоего вопроса я не совсем уверен, что ты хочешь делать. Похоже, у вас есть собственная система аутентификации, но вы все еще хотите использовать Аутентификацию по формам? Это звучит немного грязно. Я бы не рекомендовал две системы аутентификации на одном сайте. Вы можете написать собственного провайдера членства, но тогда вы не будете определять пользователей в своем файле web.config.

В ответ на последнюю часть вашего вопроса вы можете определить пользователей в своем файле web.config следующим образом:

<authentication mode="Forms">
<forms loginUrl="Logon.aspx" defaultUrl="Default.aspx">
<credentials passwordFormat="Clear">
<user name="user" password="pass" />
</credentials>
</forms>
</authentication>

Чтобы использовать вышеупомянутого пользователя в MVC, вы должны добавить атрибут [Authorize] к вашему контроллеру следующим образом:

[Authorize]
public ActionResult Index(Customer model)
{
}

Выше необходимо, чтобы пользователь уже прошел аутентификацию. Если нет, пользователь будет перенаправлен на loginUrl, указанный в web.config. Не уверен, что это будет работать в вашей ситуации, так как кажется, что вы хотите, чтобы все пользователи имели доступ к вашему действию Index.

0 голосов
/ 11 марта 2012

Возможно, вы не хотите определять каждого пользователя индивидуально, вместо этого используйте роли. Затем вы можете указать, какие роли могут выполнять какие операции, используя атрибут Authorize или в вашем пользовательском фильтре авторизации.

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