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

3

这是我的情况:

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

你是否在每个尝试访问HttpContext.User的控制器操作上放置了[Authorize]属性? - crgolden
不过,当我使用授权标签时,它会不断地将我踢回到登录页面。我将进行更新以展示我自定义应用程序 cookie 的部分。 - Dan Orlovsky
1个回答

3

首先,我认为你的 HttpContext.User 除非使用 [Authorize] 属性,否则将始终为 null

其次,我认为你的 cookie 定制看起来不错,但我没有看到你在哪里调用了 UseAuthentication()

public void Configure(IApplicationBuilder app, ILoggerFactory loggerfactory) {
    ⋮
    app.UseAuthentication();
    ⋮
}

参考: 配置身份验证服务

调用UseAuthentication方法可以启用Identity。UseAuthentication会向请求管道添加身份验证中间件。

第三步,您可以在此处找到有关自定义所有Identity视图的信息:创建完整的Identity UI源


我确实有它...但是可能我把它放错了位置,或者像我在这个问题上做了很多故障排除一样把它拿出来了。如果这个方法有效,我会将其标记为答案。 - Dan Orlovsky
不幸的是,没有成功。我在我的HomeController中添加了一个[Authorize]标签,正如预期的那样,它将我重定向到我的自定义登录页面。我的登录页面只是让我回到主页。它一直让我回到我的登录页面。 - Dan Orlovsky
1
我将此标记为答案,因为任何试图在 .Net Core 中完成我所做的工作的人都应该遵循这里提供的文档。创建一个新的 Presentation 项目并从创建完整的 Identity UI 源(主要是脚手架部分)开始,我就可以开始了。 - Dan Orlovsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接