问题标签 [aspnet-contrib]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
5619 浏览

c# - 在 ASP.NET 5 中将声明与 OpenIdConnect.Server 一起使用

在过去的 7 天里,我尝试使用OpenIdConnect.Server资源所有者流程设置 ASP.NET 5 WebApi。

[Authorize]我在生成令牌和访问受保护的操作方面或多或少是成功的。

但是,当我尝试访问时this.User.Identity.Claims,它是空的。我现在正在使用 ASP.NET 5,beta6(升级到最新的 beta7 并等待它的正式发布时遇到问题)

在 Startup.cs 我得到以下内容:

我使用app.UseOAuthBearerAuthentication是因为我无法app.UseOpenIdConnectAuthentication工作,我会在控制台中得到这个:

请求:/admin/user/ 警告:[Microsoft.AspNet.Authentication.OpenIdConnect.OpenIdConnectAuthenticationMiddleware] OIDCH_0004:OpenIdConnectAuthenticationHandler:message.State 为空或为空。请求:/.well-known/openid-configuration 警告:[Microsoft.AspNet.Authentication.OpenIdConnect.OpenIdConnectAuthenticationMiddleware] OIDCH_0004:OpenIdConnectAuthenticationHandler:message.State 为空或为空。

超时后出现异常

错误:[Microsoft.AspNet.Server.WebListener.MessagePump] ProcessRequestAsync System.InvalidOperationException:IDX10803:无法创建以从以下位置获取配置:' http ://win2012.bludev.com/api/auth/.well-known/openid -配置'。在 Microsoft.IdentityModel.Logging.LogHelper.Throw(String message, Type exceptionType, EventLevel logLevel, Exception innerException) at Microsoft.IdentityModel.Protocols.ConfigurationManager`1.d__24.MoveNext() --- 从上一个位置结束堆栈跟踪抛出异常的地方---在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 的 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) ...

有了这个配置UseOpenIdConnectAuthentication

所以真正的问题是:

  1. 如何让资源所有者流程处理索赔
  2. ValidateLifetime = true或者ValidateAudience = true会抛出异常并导致 Http Code 500 响应而没有打印错误。
  3. 如何将身份验证失败转换为有意义的 400/403 代码和 json 或 xml 响应(取决于客户端首选项)以显示给用户?(在这种情况下,JavaScript 是客户端)?
0 投票
1 回答
8235 浏览

asp.net-web-api - 使用 AspNet.Security.OpenIdConnect 分离身份验证和资源服务器 - 受众?

AspNet.Security.OpenIdConnect.Server上的示例在我看来既是身份验证服务器又是资源服务器。我想把它们分开。我已经这样做了。

在身份验证服务器的 Startup.Config 中,我有以下设置:

我写了一个 AuthorizationProvider,但我认为它与我当前的问题无关(但可能相关)。在它的 GrantResourceOwnerCredentials 覆盖中,我硬编码了一个声明主体,以便它验证每个令牌请求:

在资源服务器上,我的 Startup.config 中有以下内容:

在 Fiddler 上,我要一个令牌,我得到一个:

所以现在我使用该访问令牌从资源服务器访问受保护的资源:

我现在收到此错误 - 观众验证失败。观众:“空”。不匹配validationParameters.ValidAudience:' http://localhost:54408 '或validationParameters.ValidAudiences:'null'。

我认为原因是因为我从未在身份验证服务器上设置受众(在 app.UseOpenIdConnectServer(...)),所以我认为它没有将受众信息写入令牌。所以我需要在身份验证服务器上设置一个受众(就像在 IdentityServer3 中所做的那样),但是我在选项对象上找不到可以让我这样做的属性。

AspNet.Security.OpenIdConnect.Server 是否要求身份验证和资源位于同一服务器中?

将 ClaimsPrincipal 放在一起时是否已设置受众,如果是,如何设置?

我是否需要编写自定义受众验证器并将其连接到系统?(我当然希望这个问题的答案是否定的。)

0 投票
1 回答
4542 浏览

asp.net - 验证 AspNet.Security.OpenIdConnect.Server (ASP.NET vNext) 颁发的令牌

我正在使用 Visual Studio 2015 Enterprise 和 ASP.NET vNext Beta8 来构建一个既发布又使用 JWT 令牌的端点。我最初是通过自己生成令牌来解决这个问题的,如此所述。后来@Pinpoint 的一篇有用文章透露,可以将 AspNet.Security.OpenIdConnect.Server(又名 OIDC)配置为为我发放和使用令牌。

所以我按照这些说明,建立了一个端点,并通过提交来自邮递员的 x-www-form-urlencoded 帖子,我收到了一个合法的令牌:

这很棒,但也是我卡住的地方。现在,我如何注释控制器操作以使其需要此不记名令牌?

我想我要做的就是用 [Authorize("Bearer")] 装饰我的控制器方法,添加一个身份验证方案:

然后使用“Authorization Bearer eyJ0eXAiO ....”标题调用我的控制器操作,就像我在前面的示例中所做的那样。可悲的是,所有这些方法似乎都会产生一个异常:

处理请求时发生未处理的异常。

SocketException:无法建立连接,因为目标机器主动拒绝它 127.0.0.1:50000

WebException:无法连接到远程服务器

HttpRequestException:发送请求时发生错误。

IOException:IDX10804:无法从以下位置检索文档:“ http://localhost:50000/.well-known/openid-configuration ”。Microsoft.IdentityModel.Logging.LogHelper.Throw(字符串消息,类型 exceptionType,EventLevel logLevel,异常 innerException)

InvalidOperationException:IDX10803:无法从“ http://localhost:50000/.well-known/openid-configuration ”获取配置。内部异常:'IDX10804:无法从以下位置检索文档:' http://localhost:50000/.well-known/openid-configuration '.'。


考虑以下步骤来重现(但请不要考虑这个生产价值的代码):

  • 如此处所述应用 ASP.NET Beta8 工具

  • 打开 Visual Studio Enterprise 2015 并新建一个 Web API ASP.NET 5 Preview Template 项目

  • 更改 project.json

    {
    “webroot”:“wwwroot”,
    “版本”:“1.0.0-*”,

    “依赖项”:{
    “Microsoft.AspNet.IISPlatformHandler”:“1.0.0-beta8”,
    “Microsoft.AspNet.Mvc”: “6.0.0-beta8”、
    “Microsoft.AspNet.Server.Kestrel”:“1.0.0-beta8”、
    “Microsoft.AspNet.Authentication.JwtBearer”:“1.0.0-beta8”、
    “AspNet.Security.OpenIdConnect” .Server”:“1.0.0-beta3”、
    “Microsoft.AspNet.Authentication.OpenIdConnect”:“1.0.0-beta8”、
    “Microsoft.Framework.ConfigurationModel.Json”:“1.0.0-beta4”、
    “Microsoft .AspNet.Diagnostics”:“1.0.0-beta8"
    },

    "commands": {
    "web": "Microsoft.AspNet.Server.Kestrel"
    },

    "frameworks": {
    “dnx451”:{}
    },

    “排除”:[
    “wwwroot”,
    “node_modules”
    ],
    “publishExclude”:[
    “ .user ”,
    .vspscc”
    ]
    }

  • 更改 Startup.cs 如下(这是@Pinpoint 的原始文章提供的;我删除了评论并添加了 AddAuthorization snip):

  • 更改 Wizarded ValuesController.cs 以指定 Authorize 属性:
  • 运行项目,并使用postman获取令牌。要获取令牌,请使用 x-www-form-urlencoded POST,其中“grant_type”为“password”,“username”为任何内容,“password”为任何内容,“resource”为 API 端点的地址。例如,我的特定 URL 是http://localhost:37734/authorization/v1

  • 复制 Base64 编码的令牌,然后使用该令牌使用 postman 调用向导值控制器。要使用令牌,请使用标头 Content-Type application/json 和 Authorization Bearer eyJ0eXAiO....(您的令牌)进行 GET。我的特定 URL 是http://localhost:37734/api/values

  • 观察前面提到的异常。

如果我在上面尝试的 [Authorize("Bearer")] 方法是错误的方法,如果有人可以帮助我了解如何使用 OIDC 摄取 JWT 令牌的最佳实践,我将非常感激。

谢谢你。

0 投票
1 回答
1363 浏览

asp.net - 混合 http/https 环境中的 AspNet.Security.OpenIdConnect.Server (ASP.NET vNext) 权限配置

我正在使用 Visual Studio 2015 Enterprise 和 ASP.NET vNext Beta8 构建一个端点,该端点发出和使用 JWT 令牌,如此处详细描述。如该文章中所述,端点使用 AspNet.Security.OpenIdConnect.Server (AKA OIDC) 来完成繁重的工作。

在我们的内部开发环境中建立这个原型时,我们遇到了将它与负载平衡器一起使用的问题。特别是,我们认为这与 app.UseJwtBearerAuthentication 上的“Authority”设置以及我们特殊的 http/https 组合有关。在我们的负载平衡环境中,任何使用令牌调用 REST 方法的尝试都会产生以下异常:

WebException:无法解析远程名称:'devapi.contoso.com.well-known' HttpRequestException:发送请求时出错。
IOException:IDX10804:无法从以下位置检索文档:“ https://devapi.contoso.com.well-known/openid-configuration ”。


考虑以下步骤来重现(这是用于原型制作,不应被视为具有生产价值):

  • 我们使用 OIDC 创建了一个 beta8 原型,如此处所述

  • 我们将该项目部署到运行在 Server 2012 R2 上的 2 个相同配置的 IIS 8.5 服务器。IIS 服务器托管一个名为“API”的 beta8 站点,该站点绑定到所有可用 IP 地址上的主机名“devapi.contoso.com”的端口 80 和 443(为了本文的目的进行了清理)。

  • 两个 IIS 服务器都有一个指向自身的主机条目:

    127.0.0.1 devapi.contoso.com

  • 我们的网络管理员已将 * 证书 (*.contoso.com) 与 Kemp 负载均衡器绑定,并为https://devapi.contoso.com配置 DNS 条目以解析负载均衡器。

  • 现在这很重要,负载平衡器也已配置为使用http将 https 流量代理到 IIS 服务器(不是,重复,不是在 https 上)。已向我解释这是我们公司的标准操作程序,因为他们只需在一个地方安装证书。我们不确定为什么我们的网络管理员在 IIS 中绑定了 443,因为理论上它永远不会在此端口上接收任何流量。

  • 我们通过 https 到https://devapi.contoso.com/authorize/v1发布一个安全的帖子来获取一个令牌,它工作正常(如何制作这个帖子的详细信息在这里):

    {
    “sub”:“todo”,
    “iss”:“ https://devapi.contoso.com/ ”,
    “aud”:“ https://devapi.contoso.com/ ”,
    “exp”:1446158373,
    “ nbf": 1446154773
    }

  • 然后,我们在另一个通过 https 到https://devapi.contoso.com/values/v1/5的安全获取中使用此令牌。

  • OpenIdConnect.OpenIdConnectConfigurationRetriever 抛出异常:

WebException:无法解析远程名称:'devapi.contoso.com.well-known' HttpRequestException:发送请求时出错。
IOException:IDX10804:无法从以下位置检索文档:“ https://devapi.contoso.com.well-known/openid-configuration ”。


我们认为这是因为 OIDC 正在尝试咨询“options.Authority”中指定的主机,我们在启动时将其设置为 https://devapi.contoso.com/。此外,我们推测,由于我们的环境已配置为将负载均衡器和 IIS 之间的 https 流量转换为非 https 流量,因此当框架尝试解析https://devapi.contoso.com/时出现问题。我们已经尝试了许多配置更改,包括甚至将权限指向不安全的http://devapi.contoso.com都无济于事。

任何帮助我们理解这个问题的帮助将不胜感激。

0 投票
1 回答
220 浏览

asp.net - 使用 AspNet.Security.OpenIdConnect.Server 实现自定义主体 (ASP.NET vNext)

我正在使用 Visual Studio 2015 Enterprise 和 ASP.NET vNext Beta8 构建一个端点,该端点发出和使用 JWT 令牌,如此处详细描述

我正处于项目的阶段,我希望允许 JWT 不记名身份验证按照上述文章中的讨论进行,但是一旦令牌通过身份验证,我想:

  • 在成功进行 JWT 身份验证后介入并检查其各种声明。
  • 根据我在令牌中找到的内容,水合我自己的主体对象(比如 IContosoPrincipal)的范围实例。
  • 确保 IContosoPrincipal 的支持具体范围仅限于当前请求。
  • 稍后将依赖项注入 IContosoPrincipal 到我的一个令牌保护控制器中。

我确信这将涉及一个范围内的 IContosoPrincipal 对象,我可能会弄清楚这部分,但我不确定如何在令牌成功验证之后但在控制器/动作调用发生之前拦截 JWT 验证。

任何有关如何解决此问题的建议将不胜感激。

0 投票
1 回答
2856 浏览

asp.net - 如何指定现有 ClaimsIdentity 的目的地?

我使用下面的代码在 OpenIdConnectServerProvider.AuthorizationProvider 中创建 ClaimIdentity。但是 identity.Name 没有被封印。如何允许 OpenIdConnectServer serarlize 名称?谢谢。

上一个问题在这里How to create a ClaimIdentity in asp.net 5

0 投票
1 回答
1467 浏览

asp.net - 使用 AspNet.Security.OpenIdConnect.Server (ASP.NET vNext) 注销

我正在使用 Visual Studio 2015 Enterprise 和 ASP.NET vNext Beta8 来发布和使用 JWT 令牌,如此所述。

在我们的实现中,我们在令牌发布时将一些客户端详细信息存储在 Redis 中,并且我们希望在用户注销时刷新此信息。

我的问题是使用 OIDC 注销的最佳做法是什么?

虽然我可以为此使用自己的控制器,但我不禁注意到 Open ID Connect (OIDC) 似乎已经准备好处理这种情况。例如,OIDC 有一个 OnLogoutEndpoint 处理程序和 LogoutEndpointPath 设置。但是,当我调用 OIDC 注销 URI 时,该处理程序似乎接受了任何随机的 x-www-form-urlencoded 表单,我将其扔给它,并且似乎并没有以任何特定方式要求存在令牌。

非常感谢任何有关正确 OIDC 注销做法的建议。

0 投票
1 回答
1192 浏览

asp.net-core - 带有 ASP.NET Identity 3 的 JWT 不记名令牌

基于 Shaun Luttin 在https://stackoverflow.com/a/30857524上的出色示例,我能够使用该代码来生成和使用不记名令牌。小改动是为了获得最新的软件包:

尽管代码是一个很好的开始,但它并不是一个完全集成 w/ ASP.NET Identity 的完整解决方案。我修改了 AuthorizationProvider 类如下:

我正在使用 CreateUserPrincipalAsync 为 Validated 方法创建 ClaimsPrincipal。有没有更好的方法来集成 w/ ASP.NET Identity?

0 投票
1 回答
2393 浏览

c# - 在 AspNet.Security.OpenIdConnect.Server 中覆盖 TokenEndPoint

此处与此帖子相关的问题:配置授权服务器端点

使用上面的示例,我可以获得令牌。以前可以通过骑车获得更多信息

您如何在当前的实施中实现这一目标

谢谢!

0 投票
1 回答
1848 浏览

asp.net - 使用 AspNet.Security.OpenIdConnect.Server (ASP.NET vNext) 的自定义生命周期验证

我正在使用 Visual Studio 2015 Enterprise Update 1 和 ASP.NET vNext rc1-update1 来发布和使用 JWT 令牌,如此所述。

在我们的实现中,我们希望控制令牌生命周期验证。

我们尝试了几种方法,所有这些方法都有不良的副作用。例如,在一次尝试中,我们接管了Configure方法中的 TokenValidationParameters.TokenValidationParameters.LifetimeValidator 事件:

该事件导致验证失败,但客户端收到 500 错误,而我们希望返回 400 系列错误和一个小负载。

在另一次尝试中,我们尝试了 TokenValidationParameters.Events 的各种实现,例如检查 ValidatedToken 事件中的声明,但发现我们无法阻止中间件调用控制器操作,除非引发异常,这让我们回到了 500 错误问题。

所以我的问题是:

  • 使用 OIDC 接管生命周期验证的最佳实践是什么?

  • 我们是否可以强制 OIDC 不在令牌中包含某些终身声明,例如“nbf”,因为我们无论如何都不需要它们?