使用 Nancy 的 IdentityServer3 身份验证

IdentityServer3 Authentication with Nancy

如何使用 Nancy 进行 IdentityServer3 身份验证?

Nancy 有 OpenID 身份验证,Nancy 有 Active Directory 身份验证。 Nancy 提供简单的表单身份验证。 如何使用 Nancy 进行 IdentityServer3 身份验证和授权?

我想将登录屏幕设置为转到 IDSrv3,然后返回一个令牌和声明(角色)。

好的,我想我理解正确了:(请注意在本文末尾进行编辑 post)

  1. API 仅 如果您只提供 API 服务(没有互动视图),即如果您不提供 UI,那么您将与 OP(OpenID-Connect 提供者,在本例中为 IdentityServer3 服务器)进行交互,只有在您通过 OP 从另一个项目(使用 SSO - 单点登录)登录之后,并且只有在该应用程序之后将从 OP 收到 return 中的访问令牌。您将使用 BearerTokenAuthentication 中间件来验证访问令牌。

IdentityServer3需要等待您的调用,所以您需要注册为客户端。

1.1 没有资源: 如果您只授权 APIs(通常按角色),您所要做的就是用 [Authorize(Roles="role1,role2")].当调用 API(使用 https!!)时,您添加 TokenBearer,一切都会自动为您完成。

1.2 使用资源: 如果您还根据用户同意和声明提供资源(通常再次根据用户的角色),您应该使用 AuthorizationManager IdentityServer 简单 MVC 和 API 逐步文档。

  1. UI:如果你运行宁一个需要登录的UI,你必须添加cookies认证(Nuget),然后开启id connect认证(仿照MVC例子,Nuget IdentityServer3.OpenIdConnect Authentication)。
    这将使您的应用程序 运行 与 "hybrid flow" 以便您的第一个调用返回 id_token 和 access_token。您将这两个令牌都存储在 cookie 中(通过使用通知)。然后在注销时使用 id_token,否则浏览器允许 "replay"。

您使用 access_token 调用您的 API(与以前相同),它们又 return 范围和声明。

  1. 客户端凭据身份验证 第三个选项是无人值守(无用户登录)自动网络调用。在这种情况下,通过在 IDServ3 中设置 "secret" 并在调用 IDServ3 获取 "scopes" 列表时使用该密码和 "client name" 来使用 "Client Credentials" 登录 IDServ3 "claims",您的 API 可以决定授权或拒绝访问。

已编辑:

事实证明,API 使 Authorize[Roles="roles1,roles2"] 工作还需要几个步骤。

要使 Authorize 在 MVC 中工作,您必须创建自定义 MyAuthorizeAttribute:AuthorizeAttribute class,检查类型 "role" 的声明,或者您必须将身份服务器代码更改为 return ClaimTypes.Role 在用户的角色声明中,并具有 ScopeType=ID 的范围,其中包括 ClaimTypes.Role 角色。客户端必须允许请求这个新范围。

然后您必须在 MVC 启动 class 中请求该范围,并且没有声明转换行将声明转换为简单字符串的字典集。

现在 API 工作授权更加困难:

在调用 ui 中请求 "id_token token" responsetype 将给出没有声明中角色的 access_token。这是因为只有 ScopeType=Resource 的范围附加到 access_token。所以:

  • 您需要另一个范围类型为 ScopeType=Resource 的角色,
  • 并且 idsrv3 中的客户端必须允许请求该范围,
  • 并且您需要在 API 项目的启动代码中请求该范围以及不记名令牌启动代码。
  • 最后,由于其资源类型范围,Authorize 将起作用,但 Roles=... 将不起作用,除非您创建自己的 MyAuthorizeAttribute : AuthorizeAttribute class,用于检查角色。