这是我的情况:
我正在开发一个需要用户登录的应用程序。对于UI部分,我创建了具有本地用户帐户的MVC应用。我将不得不使用属性来扩展User,该属性总是很漂亮和干燥的。我扩展了User并将其移到域层项目中。我也将上下文移出,再次进行了裁剪和干燥,我之前已经做过几次。
但是,Identity Core似乎有所不同。如果视图已公开,我将使用默认的UI,但它们似乎位于Nuget包中某个位置的深处(?这是我的另一个问题)。
我的上下文继承了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();
我创建了一个用来处理Authorization域中任何内容的authorizationManager。我注入了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外部参照。但是尽管如此,我仍然返回null:
var user = await _userManager.GetUserAsync(HttpContext.User);
我怀疑我还没有完全迷上AspNetCores身份,但是经过几天的学习之后,我无法完全确定 where 或为什么。任何帮助或见识将不胜感激。
更新
不确定这是否相关,但是我还将在启动过程中配置Application 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;
});
答案 0 :(得分:1)
首先,除非您使用HttpContext.User
属性,否则我相信您的null
将始终为[Authorize]
。
第二,我认为您的cookie自定义看起来不错,但是我看不到您在哪里呼叫UseAuthentication()
:
public void Configure(IApplicationBuilder app, ILoggerFactory loggerfactory) {
⋮
app.UseAuthentication();
⋮
}
参考:Configure Identity services
通过调用UseAuthentication启用身份。 UseAuthentication将身份验证中间件添加到请求管道。
第三,您可以在此处找到有关自定义所有“身份”视图的信息:Create full identity UI source