2011-07-26 61 views
1

我想添加一个简单的登录。所以我认为最好的办法是将证书添加到数据库中,然后查询该证书,如果用户名和密码算法登录。这是行得通的,它查询数据库,然后您登录并重定向到主页。然后,我尝试通过网址访问家庭,并注意到我可以在没有登录的情况下进行访问。所以后来我想,我应该用在家庭控制器的授权属性不起作用

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

并与硬编码的凭据的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的属性是这样的:

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

但仍然收到相同的错误。我的意思是我可以登录,但是当我到达“家”时,我得到和以前一样的错误。这在地球上命名是什么?!任何线索?!

问候!

+0

你有没有传入任何东西的'Index'行为?例如,一个只显示空的表单? – Buildstarted

+0

对不起索引行动和哪里? – Tim

回答

0

问题是这样的:

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

您将会重定向到您的主页控制器的指数作用,其希望你在某种类型的(不知道的模式通过,因为你还没有发布的Home控制器索引操作)。当您在未指定模型的情况下调用RedirectToAction时,当您尝试访问该模型的任何元素时将导致错误,因为该模型将为空。这就是为什么你得到

Object reference not set to an instance of an object. 

这种情况发生了很多,当你调用与空模型的视图。您需要更改您的重定向以包含控制器预期的型号:

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

我认为您正在尝试正确使用[授权]。它只需要在您要锁定的Controller Action上方。 您应该发布主控制器的索引操作,以便针对您的问题获得更具体的答案。

+0

好的,但我不能用[Authorize]属性来装饰整个班级,而不仅仅是动作?!谢谢 – Tim

+0

是的,您可以在控制器级别添加[授权]属性,而不是针对特定操作。只需在Controller类声明的正上方移动[Authorize]关键字即可。 – Rondel

0

你提供了所有HomeController的代码吗?如果是这样,你错过了主控制器的索引操作。即g

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

     return View(); 
    } 

} 

现在你正在重定向到一个不存在的Action,它会给你一个错误。

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

此链接有一些非常好的教程http://www.asp.net/mvc,让我开始使用MVC。这可能有助于进一步解释你在做什么是错的。

+0

问题稍后解决。请参阅这里的答案http://stackoverflow.com/questions/7167251/mock-presence-of-authorize-attribute/7170758#comment-8660724本来可以与我的GAC。感谢您的帮助。 – Tim