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


80

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

Answers:


158

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

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

7
我刚刚更新了我的帖子,以回答您的问题。
Sam Farajpour Ghamari 2015年

5
嗨,我想告诉您,您的github示例(用于tokenauth)解决了我的问题,非常感谢!如果可以的话,我将对您的示例进行1000次投票:)
AME

6
所需的nuget软件包:-Microsoft.AspNet.Identity.Core-Microsoft.AspNet.Identity.Owin-Microsoft.Owin-Microsoft.Owin.Host.SystemWeb-Microsoft.Owin.Security-Microsoft.Owin.Security.Cookies-Microsoft.Owin .Security.OAuth-Owin
Matthieu

5
希望您对此问题有足够的悬赏,以便我们给您+1000。请将此内容发布在博客上的某个位置,以便搜索引擎可以访问此内容。这是一个简单而优雅的解决方案。我花了两天时间阅读有关OWIN和OAuth2提供的信息,但无法连接电线。
飞行员

2
@SamFarajpourGhamari:您能解释一下为什么在Login代码中需要那么长的const字符串吗?... new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string")我检查了一下,如果没有它,代码就可以正常工作!
S.Serpooshan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.