【问题标题】:IdentityServer3 Authentication with Nancy使用 Nancy 进行 IdentityServer3 身份验证
【发布时间】:2015-11-08 20:07:31
【问题描述】:

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

Nancy 使用 OpenID 身份验证,Nancy 使用 Active Directory 身份验证。 Nancy 可以轻松进行表单身份验证。 如何使用 Nancy 进行 IdentityServer3 身份验证和授权?

  • 有没有一种简单的方法可以做到这一点?
  • 我需要创建 IUserMapper 的东西吗?
  • 我应该使用 Nuget 进行表单身份验证(用于我的 UI 视图)吗?
  • 我应该使用 Nancy 令牌身份验证吗?
  • 如果我对 UI 视图或 RESTFull API 调用进行身份验证(和授权),是否有区别? (即我是否需要在“隐式流”/“代码流”/“混合流”之间进行选择,或者我可以只使用代码流吗?)
  • IdentityServer3 所查看的存储类型会有所不同吗?
  • 是否需要在 IDSrv3 上设置一些特殊的东西(如客户端定义)?并且可以/应该在 IDSrv3 配置文件中完成吗?

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

【问题讨论】:

  • 有人吗?你的意见?请!!!
  • 我不知道身份服务器 3 是什么 :(
  • 看一下他们的 github 网站,它只是一个 OAuth 提供者,所以它是在简单身份验证中实现提供者然后使用它的情况。与您的应用程序的表单身份验证相结合。
  • 不,我不是问在身份服务器中做什么。我在问我需要在 Nancy 中做什么来让我的 API 使用 IDSrv3 返回的内容进行身份验证和授权。然后在 Nancy 中如何让我的用户界面通过 IDSrv3 进行身份验证和授权。 IDSrv3 基本上是一个定制的 OpenID-Connect 服务器,可以在消费者和实际的 OpenID-Connect 提供者(即 Google、Facebook 或我自己的身份系统,无论是 ASP.Net Security、Active Directory 还是更简单的轻松定制 MembershipReboot,来自制作 IDSrv3 的同一个人。

标签: nancy identityserver3


【解决方案1】:

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

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

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

1.1 没有资源:如果您只是授权 API(通常按角色),您只需使用 [Authorize(Roles="role1,role2")] 进行装饰。调用 API(使用 https !!)时,您添加 TokenBearer,一切都会自动为您完成。

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

  1. UI:如果您正在运行需要登录的 UI,则必须添加 cookie 身份验证 (Nuget),然后打开 id 连接身份验证(按照 MVC 示例,Nuget IdentityServer3.OpenIdConnect 身份验证)。
    这将导致您的应用以“混合流” 运行,以便您的第一次调用会返回一个 id_token 和一个 access_token。您将两个令牌都存储在 cookie 中(通过使用通知)。然后在注销时使用 id_token,否则浏览器允许“重播”。

您使用 access_token 来调用您的 API(以与以前相同的方式),然后它们会返回范围和声明。

  1. 客户端凭据身份验证 第三个选项是无人(无用户登录)自动网络调用。在这种情况下,通过在 IDServ3 中设置“秘密”并在调用 IDServ3 时使用该秘密以及“客户端名称”来获取带有“声明”的“范围”列表,使用“客户端凭据”登录 IDServ3,其中您的 API 可以决定授权或拒绝访问。

编辑:

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

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

然后您必须在 MVC 启动类中请求该范围,而不是让声明转换行将声明转换为简单字符串的字典集。

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

在调用 ui 中请求“id_token token”响应类型将给出一个 access_token,而没有声明中的角色。这是因为只有 ScopeType=Resource 的范围附加到 access_token。所以:

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

【讨论】:

  • 我错了“不检查角色”如果您在接收应用程序(webapi 应用程序和/或 mvc)的启动代码的开头添加声明转换行,它将检查角色app),并使用简单类型“角色”创建声明。
  • 关于如何进行基本身份验证(用户名和密码)的任何想法?我想将此传递给身份服务器,但不确定如何形成我的 URL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 2012-09-05
相关资源
最近更新 更多