我将ASP.Net MVC Core应用程序从1.1升级到2.1,包括将ASP.Net Identity从1.1迁移到2.1。
我可以使用Sqlite进行包括ASP.Net Identity EntityFramework集成在内的所有工作。
我的startup.cs
配置类似于this:
services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>();
services.Configure<IdentityOptions>(options =>
{
// Password settings.
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Password.RequireUppercase = true;
options.Password.RequiredLength = 6;
options.Password.RequiredUniqueChars = 1;
// Lockout settings.
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
// User settings.
options.User.AllowedUserNameCharacters =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = false;
});
services.AddAuthentication()
.AddMicrosoftAccount(options =>
{
options.ClientId = Configuration["Authentication:Microsoft:ClientId"];
options.ClientSecret = Configuration["Authentication:Microsoft:ClientSecret"];
});
services.AddAuthorization(options =>
{
options.AddPolicy(PolicyNames.RequireTauchbold, policy => policy.RequireRole(Rolenames.Tauchbold));
});
在Configure()中,我有:
app.UseAuthentication();
然后在我的控制器中有:
[Authorize(Policy = PolicyNames.RequireTauchbold)]
public class EventController : Controller
{
...
完整的源代码可以在GitHub上找到。
问题是,即使我已正确登录并分配了角色,控制器上的上述检查也始终返回“拒绝访问”。我不知道这可能会出错。有人知道我会想念here吗?
我认为普通的空[Authorize]
属性有效(强制登录),但是[Authorize(Policy = '...')]
无法识别该角色。我检查了数据库表,但它们对我来说不错。我是否需要在数据库中配置ÀspNetUsers
,AspNetRoles
和AspNetUserRoles
之外的其他任何内容?
我将它与@itminus的解决方案一起使用,但是必须在启动时向AddDefaultUI()
添加一个调用才能使Login and Register再次起作用。因此,我的启动现在包含以下几行以配置身份:
services.AddIdentity<IdentityUser, IdentityRole>()
.AddRoleManager<RoleManager<IdentityRole>>()
.AddDefaultUI()
.AddEntityFrameworkStores<ApplicationDbContext>();
答案 0 :(得分:2)
我刚刚测试了您的代码。由于AddDefaultIdentity<IdentityUser>()
版本的2.1.x
默认情况下不会启用Role
,因此我将您的代码更改如下:
//services.AddDefaultIdentity<IdentityUser>()
// .AddEntityFrameworkStores<ApplicationDbContext>();
services.AddIdentity<IdentityUser, IdentityRole>()
.AddRoleManager<RoleManager<IdentityRole>>()
.AddEntityFrameworkStores<ApplicationDbContext>();
要使用上述代码进行测试,我注册了一个新用户并为该用户添加角色:
await _roleManager.CreateAsync(new IdentityRole(Rolenames.Tauchbold));
var user= await _userManager.GetUserAsync(HttpContext.User);
await _userManager.AddToRoleAsync(user, Rolenames.Tauchbold);
先退出,然后再次登录,即可使用: