使用 openIdDict,我们是否必须在 Startup.cs 中包含 'UseIdentity()'?

With openIdDict do we have to have 'UseIdentity()' in Startup.cs?

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

  1. 如果我不想 ASP.NET 核心处理我的请求,我可以只删除 UseIdentity() 吗?我试过了,现在我得到了 401 而不是 200。这样做有什么坏处,或者 OpenIdDict 是否需要 UseIdentity()?
  2. 如果我不想失去重定向登录的能力 UI 视图是 best/simplest/safest 实现此目的的方法来覆盖 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

Does OpenIdDict require 'UseIdentity()'?

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

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

All of the examples I've seen for OpenIdDict call 'UseIdentity'

对于不使用 app.UseIdentity() 的示例,您可以查看 the official password flow sample or read this blog post,其中显示了如何在没有 ASP.NET Core Identity 的情况下使用 OpenIddict。

If I don't want to lose the ability for redirects to login for UI Views is the best/simplest/safest method of accomplishing this to override 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