AspNet.Core身份-无法登录用户

时间:2019-09-24 02:14:46

标签: c# asp.net-core asp.net-identity

这是我的情况:

我正在开发一个需要用户登录的应用程序。对于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;
        });

1 个答案:

答案 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