1

我想添加一个简单的登录。因此,我认为最好的方法是将凭据添加到数据库中,然后查询该凭据以及您是否登录了用户名和密码。这是有效的,它会查询数据库,然后您会登录并重定向到家。然后我尝试通过 url 访问 home 并注意到我可以在不登录的情况下做到这一点。所以我想我应该使用

[Authorize]

Home Controller 上的属性,因为我不希望未经授权的用户访问它,因此应该将其重定向回登录页面。这不起作用。当我在控制器上使用授权时,我在应用程序中收到错误。

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

然后我尝试用这样的 Authorization 属性装饰我的 HomeController:

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

但仍然得到同样的错误。我的意思是我可以登录,但是当我到达“主页”时,我得到了和以前一样的错误。这到底是什么名字?!这有什么线索吗?!

问候!

4

2 回答 2

0

问题是这样的:

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

您正在重定向到 Home 控制器的 Index 操作,该操作期望您传入某种类型的模型(不确定,因为您尚未发布 Home 控制器 Index 操作)。当您在未指定模型的情况下调用 RedirectToAction 时,当您尝试访问该模型的任何元素时将导致错误,因为该模型将为空。这就是为什么你得到

Object reference not set to an instance of an object.

当您调用具有空模型的视图时,会经常发生这种情况。您需要更改重定向以包含控制器期望的模型:

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

我认为您正在尝试正确使用 [Authorize]。它只需要在您尝试锁定的控制器操作之上。您应该发布 Home 控制器的 Index 操作以获得有关您的问题的更具体的答案。

于 2011-08-05T13:18:27.890 回答
0

您是否提供了 HomeController 的所有代码?如果是这样,您缺少 Home 控制器的 Index 操作。例如

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

        return View();
    }

}

现在你正在重定向到一个不存在的动作,这会给你一个错误。

当 Home 控制器的 Index 操作被调用时,您需要通过定义 Index 操作来告诉您的控制器要做什么,就像我在上面所做的那样。您还需要添加一个 View 来告诉控制器在调用 Index 操作后要显示什么页面。(您的主页)

这个链接有一些非常好的教程http://www.asp.net/mvc让我开始使用 MVC。它可能有助于进一步解释您所做的事情有什么问题。

于 2011-09-06T20:10:05.823 回答