Атрибут авторизации не работает - PullRequest
1 голос
/ 27 июля 2011

Я хотел добавить простой логин.Поэтому я подумал, что лучшим способом было бы добавить учетные данные в базу данных, а затем запросить их, и, если имя пользователя и пароль совпадают, вы вошли в систему. Это работает, хорошо, это запрашивает базу данных, и вы входите в систему и перенаправляетесь на дом.Затем я попытался получить доступ к дому через URL-адрес и заметил, что я могу сделать это без входа в систему.Тогда я решил, что должен использовать атрибут

[Authorize]

на домашнем контроллере, поскольку я не хочу, чтобы неавторизованные пользователи имели к нему доступ, поэтому он должен быть перенаправлен обратно на страницу входа.Это не работает.Когда я использую авторизацию на контроллере, я получаю сообщение об ошибке в приложении.

Object reference not set to an instance of an object.

В файле web.config это выглядит так:

<authentication mode="Forms">
  <forms loginUrl="~/Login/Index" timeout="2880" /> <-- I have changed the login url to my login controller.
</authentication>

И мой контроллер входа вот так.

public ActionResult Index(UserModel model) <-- I query the db in the model.
    {
        if (!ModelState.IsValid)
        {
            return View(model);

        }

        if(!model.IsAdmin(model.UserName, model.Password))
        {  
            ModelState.AddModelError("username", "you are not a admin");
            return View(model);
        }
        FormsAuthentication.SetAuthCookie(model.UserName, false);

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

        }

Итак, как правильно использовать этот атрибут Authorize?Могу ли я использовать это так, как я это использую?Я что-то упустил в файле web.config?С уважением!

Некоторое обновление к этому.Поскольку это не работало, я добавил это в web.config:

 <authentication mode="Forms">
        <forms loginUrl="~/Account/LogOn" timeout="5">
        </forms>
    </authentication>
    <membership defaultProvider="MyMembershipProvider">
        <providers>
            <clear/>
            <add name="MyMembershipProvider" type="MyNamespace.MyMembershipProvider"
                 enablePasswordRetrieval="false" 
                 enablePasswordReset="true"
                 requiresQuestionAndAnswer="false"
                 userIsOnlineTimeWindow="2" 
                 requiresUniqueEmail="false"
                 passwordFormat="Hashed"
                 maxInvalidPasswordAttempts="5" 
                 minRequiredPasswordLength="6" 
                 minRequiredNonalphanumericCharacters="0" 
                 passwordAttemptWindow="10"
                 applicationName="/" />
        </providers>
    </membership>

И член-посредник с жестко закодированными учетными данными:

public class MyMembershipProvider : MembershipProvider 
{
    public override bool ValidateUser(string username, string password)
    {
        if (username.Equals("user", StringComparison.CurrentCultureIgnoreCase) && password.Equals("myPassword"))
            return true;
        else
            return false;
    }

Затем я попытался украсить свой HomeController с атрибутом Authorization, напримерэто:

 [Authorize()]
public class HomeController : Controller
{}

Но все равно получаю ту же ошибку.Я имею в виду, что могу войти в систему, но когда я попадаю в «Домой», я получаю ту же ошибку, что и раньше.Что в земле зовут это ?!Есть какие-нибудь ключи к этому?!

С уважением!

Ответы [ 2 ]

0 голосов
/ 07 сентября 2011

Вы предоставили весь код для вашего HomeController?Если это так, то вам не хватает действия Index на контроллере Home.например,

public class HomeController : Controller
{
    public ActionResult Index()
    {

        return View();
    }

}

Прямо сейчас вы перенаправляете на несуществующее Действие, которое выдаст вам ошибку.

Вы должны указать своему контроллеру, что делать, когда действие Index в HomeКонтроллер вызывается путем определения действия Index, как я делал выше.Вам также необходимо добавить View, который сообщает контроллеру, какую страницу отображать после вызова действия Index.(ваша домашняя страница)

Эта ссылка содержит несколько действительно хороших учебных пособий http://www.asp.net/mvc, которые помогли мне начать работу с MVC.Это может помочь в дальнейшем объяснить, что не так с тем, что вы делаете.

0 голосов
/ 05 августа 2011

Проблема заключается в следующем:

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

Вы перенаправляете на действие Index вашего контроллера Home, которое ожидает, что вы передадите модель какого-либо типа (не уверен, потому что вы не опубликовали HomeИндекс действия контроллера).Когда вы вызываете RedirectToAction без указанной модели, это приведет к ошибке при попытке доступа к любым элементам этой модели, потому что модель будет нулевой.Вот почему вы получаете

Object reference not set to an instance of an object.

. Это часто случается, когда вы вызываете представление с нулевой моделью.Вам нужно изменить свое перенаправление, чтобы включить модель, которую ожидает контроллер:

 return RedirectToAction("Index", "Home", SomeModel)

Я думаю, что вы пытаетесь использовать [Авторизовать] правильно.Это просто должно быть выше действия контроллера, которое вы пытаетесь заблокировать.Вам следует опубликовать действие Index контроллера Home, чтобы получить более конкретные ответы по вашей проблеме.

...