3 回答
TA贡献1815条经验 获得超6个赞
为了让 ASP.NET Core 管道识别用户已登录,UseAuthentication需要在类的Configure方法中调用Startup,如下所示:
app.UseAuthentication();
app.UseMvc(); // Order here is important (explained below).
使用 Cookies 身份验证方案,使用UseAuthentication松散执行以下操作:
.AspNetCore.Identity.Application从请求中读取cookie的内容,该内容代表发出请求的用户的身份。
用代表所述用户的a填充 的User属性。HttpContextClaimsPrincipal
这是对所发生情况的简化解释,但它突出了身份验证中间件执行的重要工作。如果没有身份验证中间件,.AspNetCore.Identity.Application将不会用于对用户进行身份验证,因此不会对用户进行身份验证。在您的情况下,尽管用户已登录(即正在设置 cookie),但管道中间件(例如 MVC)看不到该用户(即未读取 cookie),因此会看到未经身份验证的请求并再次重定向登录。
鉴于认证中间件读取cookie,然后填充ClaimsPrincipal,应该清楚的是,UseAuthentication呼叫也必须是之前的UseMvc呼叫为了这个正确的顺序发生。否则,MVC 中间件在身份验证中间件之前运行,并且不会使用填充的ClaimsPrincipal.
为什么不添加处理登录的中间件会登录失败?!?
中间件不处理登录 - 它处理身份验证过程。用户已登录,这由.AspNetCore.Identity.Applicationcookie的存在确认。这里失败的是读取所述cookie。
TA贡献1829条经验 获得超13个赞
请注意,该顺序很重要。我将这些颠倒过来并遇到了与原始海报所遇到的完全相同的问题。在我弄明白之前浪费了几个小时......
app.UseAuthentication(); app.UseAuthorization();
TA贡献1840条经验 获得超5个赞
如果你使用 .net core 3(这次是预览版)
将您的“app.UseEndpoints”放在 startup.cs 到代码块的末尾。
例如它应该按这个顺序
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
- 3 回答
- 0 关注
- 561 浏览
添加回答
举报