该应用程序在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();
}
}
}
答案 0 :(得分:0)
为避免强制转换,可以在两种情况下使用枚举定义用户类型并使用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
}
}