【问题标题】:asp.net 5 mvc 6 identity with restricted database backend具有受限数据库后端的 asp.net 5 mvc 6 身份
【发布时间】:2016-01-21 15:18:18
【问题描述】:

我正在尝试将 MVC6 Identity 3 与不提供查找用户接口的数据库一起使用。然而,它允许我将用户名和密码发送到存储过程,作为回报,我得到用户的访问 ID 和真实姓名。如果没有经过身份验证,我将无法获得其他任何东西,即使有,我也无法通过 id 查询其他用户。

现在,知道这一点,是否可以使用带有自定义 UserManager 的 Identity 框架来执行密码检查和检索用户详细信息?

我已经重写了允许我检查用户名和密码的 CheckPasswordAsync 方法:

    public override Task<bool> CheckPasswordAsync(ApplicationUser user, string password)
    {
        bool success = false;
        // query the database via stored procedure (only Login supported)
        var result = _dataAccess.Login(user.Login, password);
        if (result != null)
        {
            //user.UserId = result.id;
            //user.FirstNames = result.first_names;
            //user.LastName = result.last_name;
            success = true;
        }
        return Task<bool>.Factory.StartNew(() => success);
    }

注释行是一厢情愿...我想从我的控制器访问这些字段:

    [HttpPost]
    [AllowAnonymous]
    public async Task<IActionResult> Login(LoginViewModel model)
    {
        if (ModelState.IsValid)
        {
            var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
            if (result.Succeeded)
            {
                // get the current user details and return them.
                // but how?
                var userDetails = { ... };
                return Ok(userDetails);
            }
            if (result.IsLockedOut)
            {
                return new HttpStatusCodeResult((int)HttpStatusCode.Forbidden);
            }
            else
            {
                return HttpUnauthorized();
            }
        }
        return HttpUnauthorized();
    }

【问题讨论】:

    标签: database stored-procedures identity asp.net-core-mvc


    【解决方案1】:

    您可以通过调用_userManager.FindByLoginAsync() 或使用_userManager.Users 属性获取用户详细信息,然后使用linq 查询简单地检索用户。您将能够获得您的 ApplicationUser bu。

    如果您想使用存储过程存储/获取用户信息,那么您必须覆盖 UserStore。这是简短的概述:

    查看这里了解详细信息:http://www.asp.net/identity/overview/extensibility/overview-of-custom-storage-providers-for-aspnet-identity

    【讨论】:

    • 嗯,但我手头唯一拥有用户详细信息的地方是 CheckPasswordAsync。我必须将它们存储在某个地方以便 FindByLoginAsync 找到它们。
    • 也许我没有正确理解你的问题 - 你是否使用 EntityFramework 并在那里存储身份?如果是,那么 EF 将为您处理此问题。当基于您的 DB 上下文(应从 IdentityDbContext 继承)创建数据库时,EF 将在数据库中创建适当的表。它们在上下文中不可用,例如,您可以使用 UserManager、RoleManager 和 SignInManager 访问这些数据。
    • 我没有使用 EntityFramework,因为我没有表访问权限。我拥有的唯一访问权限是一个存储过程,当给定用户名和密码时,它将为我提供经过身份验证的用户详细信息或身份验证错误。
    • 啊,好吧!在这种情况下,您需要做的就是覆盖 UserStore 和 RoleStore。基于 IUserStore 创建这些类。这些类负责访问数据库表并为 UserManager 和 RoleManager 检索数据。当您覆盖它们时,您将能够使用存储过程来检索数据。
    • 这就是我的想法,但用户存储或角色存储中的任何方法都不接受密码,因此我无法使用这些方法从数据库返回任何内容。只有在 UserManager 中我才找到接受密码的方法 CheckPasswordAsync,并且我在上面的代码中显示了该方法。
    【解决方案2】:

    答案是没有解决办法。身份框架需要某种方式来访问所有用户数据,即 FindByName/FindById。需要创建这两种方法,否则无法进行身份验证。我的数据库无法提供此服务,因此身份框架不会发生。

    可行的解决方案是放弃身份并直接使用 Cookie 身份验证,并且按预期工作。

    【讨论】:

      猜你喜欢
      • 2015-04-03
      • 2016-04-04
      • 2015-02-20
      • 2016-07-02
      • 2014-04-30
      • 1970-01-01
      • 2016-06-07
      • 2013-09-06
      • 1970-01-01
      相关资源
      最近更新 更多