2

我们有一个使用 OpenIdDict 进行身份验证的 asp.net 核心 Web 应用程序。我注意到我未经身份验证的 Ajax 调用在响应正文中返回 200 和我们的登录表单。根据我的阅读,这是预期的行为,因为 OpenIdDict 处理请求,然后 ASP.NET 核心处理它并返回 200。ASP.NET 核心正在处理它,因为在 Startup.cs 中调用了“UseIdentity()”。我看到的所有 OpenIdDict 示例都称为“UseIdentity”。我有 2 个问题。

  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

4

1 回答 1

4

OpenIdDict 是否需要“UseIdentity()”?

不,OpenIddict 不直接使用在后台注册的 cookie 中间件app.UseIdentity(),因此 OpenIddict 不需要调用此方法即可正常工作。

也就是说,如果您使用依赖于 cookie 身份验证的 ASP.NET Core 身份功能(几乎AccountController/中的所有内容ManageController),那么是的,您必须使用app.UseIdentity().

我在 OpenIdDict 中看到的所有示例都调用了“UseIdentity”

对于不使用的示例app.UseIdentity(),您可以查看官方密码流示例或阅读此博客文章,其中展示了如何在没有 ASP.NET Core Identity 的情况下使用 OpenIddict。

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

这绝对有效,但我个人选择了一个更安全的选项,即使用管道分支来排除app.UseIdentity(). 这不仅可以防止 Identity 劫持 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

于 2017-04-06T15:48:24.240 回答