2

我们有一个使用OpenIdDict进行身份验证的asp.net核心Web应用程序。我注意到,我未经身份验证的Ajax调用返回了200以及我们的登录表单。从我读过的这是预期的行为,因为OpenIdDict处理请求,然后ASP.NET核心处理它并返回200. ASP.NET核心处理它,因为在Startup.cs中调用'UseIdentity()'。我所见过的所有OpenIdDict实例都调用了'UseIdentity'。我有2个问题。使用openIdDict我们必须在Startup.cs中使用'UseIdentity()'吗?

  1. 如果我不想ASP.NET核心来处理我的请求,我可以只删除“UseIdentity()”?我试过了,现在我得到了401而不是200.这样做有没有什么坏处,或者OpenIdDict是否需要'UseIdentity()'?
  2. 如果我不想失去重定向登录UI视图的能力是完成此操作以覆盖OnRedirectToLogin的最好/最简单/最安全的方法?下面的代码示例:

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

回答

3

是否OpenIdDict需要 'UseIdentity()'?

号,由app.UseIdentity()引擎盖下注册的饼干中间件不直接使用OpenIddict,所以调用此方法不需要OpenIddict才能正常工作。也就是说,如果您使用依靠cookie身份验证的ASP.NET Core Identity功能(几乎所有的东西都在AccountController/ManageController),那么是的,您必须使用app.UseIdentity()

所有我见过OpenIdDict呼叫“UseIdentity”

对于不使用app.UseIdentity(),你可以在the official password flow sample看一看或阅读this blog post样本的例子,显示了如何在没有ASP.NET Core Identity的情况下使用OpenIddict。

如果我不想失去重定向登录UI视图的能力,是完成此操作以覆盖OnRedirectToLogin的最佳/最简单/最安全的方法?

这绝对有效,但我个人选择了一个更安全的选项,即使用管道分支来排除由app.UseIdentity()注册的cookie中间件。这不仅可以防止身份劫持你的API返回的401级响应,同时也避免了XSRF攻击的HttpContext.User无法从cookie中提取的身份来填充:

app.UseWhen(context => !context.Request.Path.StartsWithSegments("/api"), branch => 
{ 
    branch.UseIdentity(); 
}); 

一个完整的样本见https://github.com/openiddict/openiddict-samples/blob/master/samples/CodeFlow/AuthorizationServer/Startup.cs#L141-L158

+0

这很好。谢谢! – Bloodhound

+0

您是否有示例项目或指南,可以使用Core 2.0和OpenIdDict 2.x做同样的事情? – Bloodhound

+1

所有OpenIddict示例已更新为2.x:https:// github。COM/openiddict/openiddict样本。遗憾的是,2.x中不再支持基于路径的身份验证中间件选择,并且推荐使用'[Authorize(AuthenticationSchemes =“Bearer”)]方法。阅读https://github.com/aspnet/Announcements/issues/262了解更多信息。 – Pinpoint

相关问题