Настройка ASP.net Identity для работы с существующей базой данных

Допустим, у меня есть база данных, которая имеет собственную таблицу UserAccount, UserRole и другие необходимые приложения приложения. Я хочу знать, как настроить аутентификацию ASP.Net Identity для работы с моими собственными созданными таблицами базы данных. ASP.Net Identity сначала использует код, а я нет. Я просто запутался, как мне это сделать. Любой совет будет полезен.

заранее спасибо

1 ответ

Расширьте классы MembershipProvider и RoleProvider. Реализуйте необходимые методы. Конфигурация точки, чтобы использовать ваши провайдеры

ОЧЕНЬ простой способ - использовать только поставщика ролей:

public class MyRoleProvider : RoleProvider
{
    public override bool IsUserInRole(string username, string roleName)
    {
        throw new NotImplementedException();
    }

    public override string[] GetRolesForUser(string username)
    {
        using (var userDao = new UserDao())
        {
            var user = userDao.GetUser(username);

            return user == null ? new string[0] : user.Roles
               .Select(r => r.Name).ToArray();
        }
    }

    public override void CreateRole(string roleName)
    {
        throw new NotImplementedException();
    }

    public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
    {
        throw new NotImplementedException();
    }

    public override bool RoleExists(string roleName)
    {
        throw new NotImplementedException();
    }

    public override void AddUsersToRoles(string[] usernames, string[] roleNames)
    {
        throw new NotImplementedException();
    }

    public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
    {
        throw new NotImplementedException();
    }

    public override string[] GetUsersInRole(string roleName)
    {
        throw new NotImplementedException();
    }

    public override string[] GetAllRoles()
    {
        throw new NotImplementedException();
    }

    public override string[] FindUsersInRole(string roleName, string usernameToMatch)
    {
        throw new NotImplementedException();
    }

    public override string ApplicationName { get; set; }
}

А вот мой AccountController, если это MVC:

public class AccountsController : Controller
{
    public ActionResult Login()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Login(LoginPage loginPage)
    {
        if (ModelState.IsValid)
        {
            using (var userDao = new UserDao())
            {
                var user = userDao.GetUser(loginPage.Login);
                if (user != null && user.Password == loginPage.Password)
                {
                    FormsAuthentication.SetAuthCookie(loginPage.Login, loginPage.RememberMe);
                    return RedirectToAction("Index", "Campaigns");
                }
            }
        }

        return View(loginPage);
    }

    public ActionResult Logout()
    {
        FormsAuthentication.SignOut();
        return RedirectToAction("Login");
    }
}

Модель (на всякий случай):

public class LoginPage
{
    [Required(ErrorMessage = "Enter login")]
    public string Login { get; set; }

    [Required(ErrorMessage = "Enter password")]
    public string Password { get; set; }

    public bool RememberMe { get; set; }
}

Конфигурация (внутри):

<authentication mode="Forms">
  <forms loginUrl="/Accounts/Login" defaultUrl="/Campaigns/Index" />
</authentication>

<authorization>
  <deny users="?" />
</authorization>

<roleManager enabled="true" defaultProvider="CustomRoleProvider">
  <providers>
    <clear />
    <add name="CustomRoleProvider" type="BellIntegrator.OsmSkyMobile.Web.Helpers.SkyRoleProvider" />
  </providers>
</roleManager>
Другие вопросы по тегам