首页 文章

如何在ASP.NET MVC 5中实现自定义身份验证

提问于
浏览
70

我正在开发一个ASP.NET MVC 5应用程序 . 我有一个现有的数据库,我从中创建了我的ADO.NET实体数据模型 . 我在该DB中有一个包含“username”和“password”列的表,我想用它们在我的Webapp中实现身份验证和授权;我无法创建任何其他数据库或表或列,因为客户的要求,我无法使用标准身份验证 . 我不需要管理注册,密码更改或其他内容:只需使用密码和用户名登录 . 我怎样才能做到这一点?

1 回答

  • 135

    是的你可以 . 身份验证和授权部分独立工作 . 如果您有自己的身份验证服务,则可以使用OWIN的授权部分 . 考虑一下你已经有 UserManager 验证了 usernamepassword . 因此,您可以在回发登录操作中编写以下代码:

    [HttpPost]
    public ActionResult Login(string username, string password)
    {
        if (new UserManager().IsValid(username, password))
        {
            var ident = new ClaimsIdentity(
              new[] { 
                  // adding following 2 claim just for supporting default antiforgery provider
                  new Claim(ClaimTypes.NameIdentifier, username),
                  new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string"),
    
                  new Claim(ClaimTypes.Name,username),
    
                  // optionally you could add roles if any
                  new Claim(ClaimTypes.Role, "RoleName"),
                  new Claim(ClaimTypes.Role, "AnotherRole"),
    
              },
              DefaultAuthenticationTypes.ApplicationCookie);
    
            HttpContext.GetOwinContext().Authentication.SignIn(
               new AuthenticationProperties { IsPersistent = false }, ident);
            return RedirectToAction("MyAction"); // auth succeed 
        }
        // invalid username or password
        ModelState.AddModelError("", "invalid username or password");
        return View();
    }
    

    您的用户管理器可以是这样的:

    class UserManager
    {
        public bool IsValid(string username, string password)
        {
             using(var db=new MyDbContext()) // use your DbConext
             {
                 // for the sake of simplicity I use plain text passwords
                 // in real world hashing and salting techniques must be implemented   
                 return db.Users.Any(u=>u.Username==username 
                     && u.Password==password); 
             }
        }
    }
    

    最后,您可以通过添加 Authorize 属性来保护您的操作或控制器 .

    [Authorize]
    public ActionResult MySecretAction()
    {
        // all authorized users can use this method
        // we have accessed current user principal by calling also
        // HttpContext.User
    }
    
    [Authorize(Roles="Admin")]
    public ActionResult MySecretAction()
    {
        // just Admin users have access to this method
    }
    

相关问题