2011-07-26 8 views
1

単純なログインを追加したいと考えました。だから、私はデータベースの資格情報を追加し、それを照会し、ユーザー名とパスワードを取得すればログインすることが最善の方法だと思った。これはうまくいけば、dbを照会し、ログインして自宅にリダイレクトする。それから私はURLを介して家にアクセスしようとし、私はログインせずにそれを行うことができることに気づいた。それでは、私は権限のないユーザーがそうインクルードは、ログインページに戻ってリダイレクトする必要があり、それをアクセスさせたくないと私はホームコントローラの認証属性が機能しない

[Authorize] 

属性を使用する必要があることを考え出しました。これは動作しません。コントローラでauthorizeを使用すると、アプリケーションでエラーが発生します。このような

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

そして、私のログインコントローラ:それはこのようになりますweb.configファイルで

Object reference not set to an instance of an object. 

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に何か不足していますか? よろしく!

一部の更新です。

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

そして、ハードコードされた資格情報とのMembershipProvider:

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を飾るみました:それは働いていなかったとして、私は、web.configファイルにこれを追加

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

しかし、まだ同じエラーが発生しています。私はログインすることができますが、私が "ホーム"に到達すると、以前と同じエラーが発生します。地球の名前でこれは何ですか?これに対する手がかりは?

よろしくお願いいたします。

+0

何も渡されない 'Index'アクションがありますか?たとえば、空のフォームを表示するだけですか? – Buildstarted

+0

申し訳ありませんどのようなインデックスアクションとはどこですか? – Tim

答えて

0

問題はこれです:あなたはホームコントローラを投稿していないので、あなたには、いくつかのタイプ(わからないのモデルに合格することを期待あなたのホームコントローラのindexアクションにリダイレクトされている

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

インデックスアクション)。モデルを指定せずにRedirectToActionを呼び出すと、モデルがnullになるため、そのモデルの要素にアクセスしようとするとエラーが発生します。だからこそ、あなたは

Object reference not set to an instance of an object. 

ヌルモデルのビューを呼び出すときに起こります。

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

私はあなたが正しく、[承認]を使用しようとしていると思う:あなたは、コントローラは、期待したモデルを含めるようにリダイレクトを変更する必要があります。これは、ロックしようとしているコントローラアクションの上にある必要があります。 ホームコントローラーの索引アクションを掲示して、問題についてより具体的な答えを得る必要があります。

+0

okですが、アクションの代わりに[Authorize]属性でクラス全体を飾ることはできますか?ありがとう – Tim

+0

ええ、特定のアクションではなくコントローラレベルで[Authorize]属性を追加できます。 [Authorize]キーワードをControllerクラス宣言のすぐ上に移動するだけです。 – Rondel

0

あなたのHomeControllerにすべてのコードを提供しましたか?その場合は、ホームコントローラのインデックスアクションがありません。 e。g

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

     return View(); 
    } 

} 

今はエラーが発生する存在しないアクションにリダイレクトされています。

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

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

+0

問題は後で解決されました。ここの答えを見てくださいhttp://stackoverflow.com/questions/7167251/mock-presence-of-authorize-attribute/7170758#comment-8660724私のGACで何かされている可能性があります。しかし、助けてくれてありがとう。 – Tim

関連する問題