我们有一个使用OpenIdDict进行身份验证的asp.net核心Web应用程序。我注意到我未经身份验证的Ajax调用会在响应正文中返回200和我们的登录表单。从我读到的这是预期的行为,因为OpenIdDict处理请求,然后ASP.NET核心处理它并返回200. ASP.NET核心正在处理它,因为在Startup.cs中调用'UseIdentity()'。我在OpenIdDict上看到的所有例子都称为“UseIdentity”。我有两个问题。
options.Cookies.ApplicationCookie.Events = new CookieAuthenticationEvents
{
OnRedirectToLogin = ctx =>
{
if (ctx.Request.Path.StartsWithSegments("/api") &&
ctx.Response.StatusCode == (int) HttpStatusCode.OK)
{
ctx.Response.StatusCode = (int) HttpStatusCode.Unauthorized;
}
else
{
ctx.Response.Redirect(ctx.RedirectUri);
}
return Task.FromResult(0);
}
};
代码示例来源:https://devblog.dymel.pl/2016/07/07/return-401-unauthorized-from-asp-net-core-api/
此处有关此问题的进一步讨论:https://github.com/aspnet/Security/issues/804
答案 0 :(得分:3)
OpenIdDict是否需要' UseIdentity()'?
不,由app.UseIdentity()
引导注册的Cookie中间件不会被OpenIddict直接使用,因此OpenIddict无需调用此方法即可正常工作。
也就是说,如果您使用依赖于cookie身份验证的ASP.NET核心身份功能(几乎AccountController
/ ManageController
中的所有内容),那么是的,您必须使用{{1} }。
我在OpenIdDict上看到的所有示例都打电话给' UseIdentity'
对于不使用app.UseIdentity()
的示例,您可以查看the official password flow sample或阅读this blog post,其中显示了如何在没有ASP.NET核心身份的情况下使用OpenIddict
如果我不想失去重定向登录UI视图的能力,最好/最简单/最安全的方法是覆盖OnRedirectToLogin?
这绝对有效,但我亲自选择了更安全的选项,包括使用管道分支来排除app.UseIdentity()
注册的Cookie中间件。这不仅可以防止Identity劫持您的API返回的401响应,还可以避免XSRF攻击,因为app.UseIdentity()
无法填充从cookie中提取的标识:
HttpContext.User