Как определить и использовать разные типы пользователей в ASP.NET Core - PullRequest
0 голосов
/ 23 ноября 2018

Приложение имеет следующих пользователей и контроллер в ASP.NET Core 2.1.

AppUser

using Microsoft.AspNetCore.Identity;

namespace MyApp.Models
{
    public class AppUser : IdentityUser
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
}

DifferentUser

namespace MyApp.Models
{
    public class DifferentUser : AppUser
    {
        public string Property1 { get; set; }
    }
}

DifferentUserController.cs

using System.Threading.Tasks;
using MyApp.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;

    namespace MyApp.Controllers
    {
        [Authorize(Roles = "DifferentUser")]
        public class DifferentUserController : Controller
        {

            private UserManager<AppUser> userManager;

            public DifferentUserController(UserManager<AppUser> _userManager)
            {
                userManager = _userManager;
            }

            [HttpGet]
            public async Task<IActionResult> Index()
            {
                var user = (DifferentUser) await userManager.GetUserAsync(HttpContext.User);
                return View("~/Views/DifferentUser/Index.cshtml", user);
            }
        }
    }

Внутри DifferentUserController метод Index должен возвращать представление и передавать его в текущий момент зарегистрированному в DifferentUser.Но он возвращает следующую ошибку.

InvalidCastException: Unable to cast object of type 'MyApp.Models.AppUser' to type 'MyApp.Models.DifferentUser'.

Как правильно / лучше всего обрабатывать разные типы пользователей в ASP.NET Core 2.1?

Startup.cs

using Microsoft.AspNetCore.Builder;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using MyApp.Models;
using MyApp.Infrastructure;
using Microsoft.AspNetCore.Identity;

namespace MyApp
{
    public class Startup
    {

        public Startup(IConfiguration configuration) =>
            Configuration = configuration;

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddTransient<IPasswordValidator<AppUser>,
                CustomPasswordValidator>();

            services.AddTransient<IUserValidator<AppUser>,
                CustomUserValidator>();

            services.AddDbContext<AppIdentityDbContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

            services.AddIdentity<AppUser, IdentityRole>(opts => {
                opts.User.RequireUniqueEmail = true;
                opts.Password.RequiredLength = 6;
                opts.Password.RequireNonAlphanumeric = false;
                opts.Password.RequireLowercase = false;
                opts.Password.RequireUppercase = false;
                opts.Password.RequireDigit = false;
            }).AddEntityFrameworkStores<AppIdentityDbContext>()
                .AddDefaultTokenProviders();

            services.AddMvc();
        }

        public void Configure(IApplicationBuilder app)
        {
            app.UseStatusCodePages();
            app.UseDeveloperExceptionPage();
            app.UseStaticFiles();
            app.UseAuthentication();
            app.UseMvcWithDefaultRoute();
        }
    }
}

1 Ответ

0 голосов
/ 23 ноября 2018

Чтобы избежать необходимости приведения, вы можете использовать enum для определения вашего типа пользователя и использовать ваш класс AppUser в обоих случаях.Это сделает возможным в этом сценарии.

public class AppUser : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public UserType Type { get; set; }

    public enum UserType {
        User,
        OtherUser
    }
}
...