Как получить доступ к другим объектам из ASP.NET Основные классы идентификации?

#asp.net-core #asp.net-identity

#asp.net-ядро #asp.net-идентификация

Вопрос:

Новичок в ASP.NET Ядро. Я использую Identity framework для аутентификации, среди прочего, используя страницу Register razor. В Register.cshtml.cs я хотел бы получить данные для заполнения выпадающего меню. Данные находятся в другой части таблиц Entity Framework. Таким образом, цель состоит в том, чтобы иметь возможность выбирать, например, «Компанию» при регистрации пользователя.

Мне не нравится слишком много возиться с Register.cshtml.cs , т. Е. Изменять конструктор, чтобы использовать мои собственные сервисы и / или контекстные объекты. Но как получить доступ к «моим собственным» таблицам с этой страницы?

Можно ли это сделать? Или это не должно быть сделано (почему?)? И если нет, какие-либо советы по созданию этого общего пользовательского администрирования в сочетании с Identity framework?

Спасибо,

Palle

Ответ №1:

Чем ASP.NET Core Identity используется для управления пользователями, паролями, данными профиля, ролями, утверждениями, токенами, подтверждением по электронной почте и многим другим. Мы можем использовать UserManager, RoleManager и SignInManager для управления следующими таблицами:

введите описание изображения здесь

Более подробную информацию об идентификации см. В разделе Идентификация на ASP.NET Ядро.

Чтобы получить доступ к другим таблицам Entity Framework, я думаю, вам нужно использовать контекст базы данных в Register.cshtml.cs, например:

 public class RegisterModel : PageModel
{
    private readonly SignInManager<ApplicationUser> _signInManager;
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly ILogger<RegisterModel> _logger;
    private readonly IEmailSender _emailSender;

    private readonly ApplicationDbContext _context;

    public RegisterModel(
        UserManager<ApplicationUser> userManager,
        SignInManager<ApplicationUser> signInManager,
        ILogger<RegisterModel> logger,
        ApplicationDbContext context,
        IEmailSender emailSender)
    {
        _userManager = userManager;
        _signInManager = signInManager;
        _logger = logger;
        _context = context;
        _emailSender = emailSender;
    }

    [BindProperty]
    public InputModel Input { get; set; }

    public string ReturnUrl { get; set; }
    [BindProperty]
    public List<Company> Companies { get; set; }
    public IList<AuthenticationScheme> ExternalLogins { get; set; }


    public class InputModel
    {
         ...
    }

    public async Task OnGetAsync(string returnUrl = null)
    {
        ReturnUrl = returnUrl;
        ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
        Companies = _context.Companies.ToList(); //get all companies from database.
    }
 

Кроме того, если вы все еще не хотите использовать контекст базы данных. Вы могли бы рассмотреть возможность установки списка выбранных элементов с фиксированными параметрами или использования списка перечислений, не получая их из базы данных.

Комментарии:

1. Спасибо, Чжи, в итоге я сделал именно это, хотя и со ссылкой на собственную зарегистрированную службу, а не непосредственно на контекст БД. Но очень полезно подтвердить это, так что еще раз спасибо.