使用openIdDict,我们必须在Startup.cs中使用'UseIdentity()'吗?

时间:2017-04-04 13:05:13

标签: asp.net-core-mvc asp.net-core-webapi asp.net-identity-3 openiddict

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

  1. 如果我不希望ASP.NET核心处理我的请求,我可以删除'UseIdentity()'吗?我试过了,现在我得到的是401而不是200.这样做有什么害处或者OpenIdDict是否需要'UseIdentity()'?
  2. 如果我不想失去重定向登录UI视图的能力,最好/最简单/最安全的方法是覆盖OnRedirectToLogin?代码示例如下:
  3. 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

1 个答案:

答案 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

有关完整示例,请参阅https://github.com/openiddict/openiddict-samples/blob/master/samples/CodeFlow/AuthorizationServer/Startup.cs#L141-L158