ASP.NET MVC2中非常简单的单用户登录?

时间:2011-06-18 18:58:11

标签: asp.net asp.net-mvc asp.net-mvc-2 asp.net-authentication asp.net-authorization

我正在构建我的网站,我想限制我的网站的一部分(管理部分)来自正常的公开显示。

  • 我正在使用LINQ进行数据库访问。
  • 我有一个Service类来处理通过LINQ
  • 对数据库的调用
  • 我整个网站都在运行,但登录部分除外。

到目前为止,我已经 能够使用MembershipProvider和/或RoleProviders等找到示例。说实话,对我想要的东西看起来似乎太多了。 所有这一切是让您在输入字段中输入正确的密码。

我真的不能避开提供商吗?

4 个答案:

答案 0 :(得分:6)

由于您只有一个用户,因此无需创建数据库依赖关系。您可以根据硬编码凭据制作非常简单的授权服务。例如,

public class AuthorizationService{
     private AuthorizationService(){}
     public static readonly AuthorizationService Instance = new AuthorizationService();

     private const string HardCodedAdminUsername = "someone";
     private const string HardCodedAdminPassword = "secret";
     private readonly string AuthorizationKey = "ADMIN_AUTHORIZATION";

     public bool Login(string username, string password, HttpSessionStateBase session){
         if(username.ToLowerInvariant().Trim()==HardCodedAdminUsername && password.ToLowerInvariant().Trim()==HardCodedAdminPassword){
              session[AuthorizationKey] = true;
              return true;
         } 
         return false;
     }

     public void Logout(HttpSessionStateBase session){
        session[AuthorizationKey] = false;
     }

     public bool IsAdmin(HttpSessionStateBase session){
         return session[AuthorizationKey] == true;
     }
}

然后您可以构建自定义IAuthorizationFilter,如:

public class SimpleAuthFilterAttribute: FilterAttribute, IAuthorizationFilter{
     public void OnAuthorization(AuthorizationContext filterContext){
         if(!AuthorizationService.Instance.IsAdmin(filterContext.HttpContext.Session)){
              throw new UnauthorizedAccessException();
         }
     }
}

然后你所要做的就是用SimpleAuthFilter装饰受保护的控制器动作,你应用程序的登录突然起作用。好极了! (注意,我在StackOverflow应答窗口中编写了所有这些代码,因此您可能需要在实际工作之前清除错别字等

,如果您发现不必要,可以重构此操作以省略用户名。如果您希望可以访问受保护的控制器操作,则需要为LoginLogout创建一个控制器操作,以对AuthorizationService进行相应的调用。

答案 1 :(得分:3)

值得建立一个轻量级的会员提供商,实施最少; GetUser,ValidateUser等方法。你不需要实现整个事情。它只是帮助授权页面并在需要时检查User.Identity等。您也不需要RoleProvider或ProfileProvider来执行此操作。

它也可以扩展到未来。

<强>更新

您只需要实现核心方法来验证并获取用户并插入您自己的验证/数据访问代码。

像这样......

web.config设置:

<membership defaultProvider="ApplicationMembershipProvider">
      <providers>
        <clear/>
        <add name="ApplicationMembershipProvider" type="YourNamespace.ApplicationMembershipProvider"/>
      </providers>
    </membership>

登录代码:

if (Membership.ValidateUser(username, password))
            {
                FormsAuthentication.SetAuthCookie(username, false);
}

答案 2 :(得分:0)

您可以在会话变量中设置状态(登录与否)。如果用户输入了正确的密码,则将变量设置为true,然后在要限制访问的每个页面上,检查变量是否为真。

答案 3 :(得分:0)

@KristianB前一段时间我回答了this SO question。我相信它可能很有用,因为它实现起来非常简单,同时它比在代码中硬编码用户名和密码更好。

祝你好运!