这是我的情况:
我正在开发一个需要用户登录的应用程序。对于UI部分,我创建了一个带有本地用户账户的MVC应用程序。我将不得不扩展User属性,这通常是非常简单明了的。我扩展了User并将其移到了domain-layer项目中。我也将上下文(context)移动了出来,这也很简单明了,我以前也做过几次。
然而,Identity Core似乎有所不同。如果视图被公开,我会使用默认UI,但它们似乎深藏在Nuget package里(?这是我另外一个问题)。
我的Context继承了IdentityDbContext类:
public class MyContext : IdentityDbContext<User, IdentityRole, string>, IMyContext
我在 Startup.cs 中注册身份验证相关的内容:
services
.AddIdentity<User, IdentityRole>()
.AddEntityFrameworkStores<MyContext>()
.AddDefaultTokenProviders();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddAuthorization();
我创建了一个授权管理器,用于处理与授权有关的任何事情。我注入了userManager和signInManager:
public AuthorizationManager(UserManager<User> userManager,
SignInManager<User> signInManager,
IMapper mapper)
{
_signInManager = signInManager;
_userManager = userManager;
_mapper = mapper;
}
然后像这样登录用户:
public async Task<UserDto> LoginUser(UserLoginInput input)
{
var user = input.UserNameOrEmail.Contains("@") ?
await _userManager.FindByEmailAsync(input.UserNameOrEmail) :
await _userManager.FindByNameAsync(input.UserNameOrEmail);
var signInResult = await _signInManager.CheckPasswordSignInAsync(user, input.Password, false);
return signInResult.Succeeded ?
_mapper.Map<UserDto>(user) :
null;
}
登录结果确实显示成功,但之后我始终无法访问该用户或他们所担任的角色。我已检查数据库中是否存在用户和角色,并且UserRole xref也存在。但是尽管如此,我仍然返回null:
var user = await _userManager.GetUserAsync(HttpContext.User);
我猜测自己对AspNetCores身份认证没太弄明白,但经过几天的学习,我还是无法确定在哪里或为什么。非常感谢任何帮助和见解。
更新
不确定这是否相关,但我也在启动时配置了应用程序Cookie:
services.ConfigureApplicationCookie(options =>
{
options.AccessDeniedPath = "/Authorization/AccessDenied";
options.Cookie.Name = "MyApplication_Auth";
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromDays(7);
options.LoginPath = "/Authorization/Login";
options.ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;
options.SlidingExpiration = true;
});
[Authorize]
属性? - crgolden