У нас есть MVC приложение с членством в роли и IdentityServer для единого входа, оба являются отдельными приложениями. У нас есть две роли в нашем приложении - Admin и RegularUser. Каждый из них имеет определенный c набор свойств, например:
public class Admin
{
public string Area { get; set; }
public int Code { get; set;}
}
public class RegularUser
{
public string SkypeId { get; set; }
public string HomeAddress { get; set; }
}
В соответствии с шаблоном IdentityServer мы должны использовать один класс ApplicationUser для хранения всех данных профиля. Какова лучшая практика организации c хранилища данных с указанием ролей в разных приложениях? Моя мысль состоит в том, чтобы отделить хранилище профилей (ApplicationUser, в области IdentityServer) от сущностей домена (Admin и RegularUser, в области приложения MVC) и связать их вместе с ключом:
public class Admin
{
public string ApplicationUserId { get; set; }
public string Area { get; set; }
public int Code { get; set;}
}
public class RegularUser
{
public string ApplicationUserId { get; set; }
public string SkypeId { get; set; }
public string HomeAddress { get; set; }
}
Когда мы перенаправив из SSO после успешного входа в приложение MVC, мы можем получить Admin или RegularUser в контроллере следующим образом:
[Authorize]
public async Task<IActionResult> SomeAction()
{
string userId = _userManager.GetUserId(User);
if (User.IsInRole("Admin"))
{
Admin admin = await _adminRepository.GetByApplicationUserId(userId);
/* logic for admin */
}
if (User.IsInRole("RegularUser"))
{
RegularUser regularUser = await _regularUserRepository.GetByApplicationUserId(userId);
/* logic for regularUser */
}
...
}