【问题标题】:How to implement custom authentication in ASP.NET MVC 5如何在 ASP.NET MVC 5 中实现自定义身份验证
【发布时间】:2015-10-13 14:09:48
【问题描述】:

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

【问题讨论】:

    标签: c# asp.net-mvc authentication authorization asp.net-identity


    【解决方案1】:

    是的,你可以。身份验证和授权部分独立工作。如果您有自己的身份验证服务,您可以只使用 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
    } 
    

    【讨论】:

    • 我刚刚更新了我的帖子来回答你的问题。
    • 嘿,我想让您知道您的 github 示例(用于 tokenauth)解决了我的问题,非常感谢!如果可以的话,我会支持你的例子 1000 次 :)
    • 需要 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
    • 我希望你有这个问题的悬赏,所以我们可以给你 +1000。请在博客的某个地方发布此内容,以便搜索引擎可以访问此内容。这是如此简单而优雅的解决方案。我花了两天时间阅读有关 OWIN 和 OAuth2 提供的信息,但无法连接电线。
    • @SamFarajpourGhamari:您能解释一下为什么Login 代码中需要这么长的 const 字符串吗? ... new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string")我检查了代码没有它就可以正常工作!
    猜你喜欢
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    相关资源
    最近更新 更多