1

簡単なログインを追加したかったのです。したがって、データベースに資格情報を追加し、それをクエリして、ユーザー名とパスワードが一致する場合にログインするのが最善の方法だと思いました。これは機能しており、データベースにクエリを実行すると、ログインしてホームにリダイレクトされます。次に、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;
    }

次に、次のような Authorization 属性で HomeController を装飾してみました。

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

しかし、それでも同じエラーが発生します。ログインできるということですが、「ホーム」に到達すると、以前と同じエラーが発生します。これは地球上で何という名前ですか?! これの手がかりはありますか?!

よろしく!

4

2 に答える 2

0

問題はこれです:

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

あるタイプのモデルを渡すことを期待しているホームコントローラーのインデックスアクションにリダイレクトしています(ホームコントローラーのインデックスアクションを投稿していないため、わかりません)。モデルを指定せずにRedirectToActionを呼び出すと、モデルがnullになるため、そのモデルの要素にアクセスしようとするとエラーが発生します。だからあなたは

Object reference not set to an instance of an object.

これは、nullモデルを使用してビューを呼び出すときによく発生します。コントローラが期待するモデルを含めるようにリダイレクトを変更する必要があります。

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

[認証]を正しく使用しようとしていると思います。ロックダウンしようとしているコントローラーアクションの上にある必要があります。問題に関するより具体的な回答を得るには、ホームコントローラーのインデックスアクションを投稿する必要があります。

于 2011-08-05T13:18:27.890 に答える
0

HomeController のすべてのコードを提供しましたか? その場合、Home コントローラーの Index アクションがありません。例えば

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

        return View();
    }

}

現在、存在しないアクションにリダイレクトしているため、エラーが発生します。

上で行ったように Index アクションを定義することで、Home コントローラーの Index アクションが呼び出されたときに何をすべきかをコントローラーに指示する必要があります。また、Index アクションが呼び出された後に表示するページをコントローラーに伝えるビューを追加する必要があります。(あなたのホームページ)

このリンクには、MVC を使い始めるきっかけとなった、本当に優れたチュートリアルhttp://www.asp.net/mvcがいくつかあります。あなたがしていることの何が悪いのかをさらに説明するのに役立つかもしれません。

于 2011-09-06T20:10:05.823 に答える