使用Nancy进行IdentityServer3身份验证

时间:2015-11-08 20:07:31

标签: nancy identityserver3

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

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

  • 有一个简单易行的方法吗?
  • 我是否需要创建IUserMapper?
  • 我应该使用Nuget进行表单身份验证(对于我的UI视图)吗?
  • 我应该使用Nancy Token身份验证吗?
  • 如果我正在为UI视图或RESTFull API调用进行身份验证(和授权),是否存在差异? (即我需要在“隐式流程”/“代码流程”/“混合流程”之间进行选择,还是我可以使用代码流?)
  • IdentityServer3正在关注哪种商店会有所不同?
  • 我是否需要在IDSrv3上设置任何特殊内容(如客户端定义)?可以/应该在IDSrv3配置文件中完成吗?

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

1 个答案:

答案 0 :(得分:0)

好的,我认为我理解正确:(请注意本帖末尾的编辑)

  1. 仅限API 如果您的唯一服务API(没有交互式视图),即如果您没有为UI提供服务,那么您将与OP(OpenID-Connect提供商, - 在此交互)进行交互只有在您通过OP从其他项目(使用SSO - 单点登录)登录之后,并且仅在该应用程序将从OP接收到访问令牌之后,才会出现IdentityServer3服务器)。您将使用BearerTokenAuthentication中间件来验证访问令牌。
  2. IdentityServer3需要您的呼叫,因此您需要注册为客户端。

    1.1 没有资源:如果您只是授权API(通常是角色),您只需要使用[授权(角色="角色1,角色2和#34;)进行装饰。 ]。在调用API(使用https !!)时,您需要添加TokenBearer,所有内容都会自动完成。

    1.2 使用资源:如果您还根据用户同意和声明(通常再次根据用户的角色)提供资源,则应使用IdentityServer中建议的AuthorizationManager简单的MVC和API step-trough doc。

    1. UI :如果您正在运行需要登录的UI,则必须添加Cookie身份验证(Nuget),然后打开ID连接身份验证(按照MVC示例,Nuget IdentityServer3.OpenIdConnect身份验证) 。
      这将导致您的应用使用"混合流" 运行,以便您的第一次调用带回id_token和access_token。您将两个令牌存储在cookie中(通过使用通知)。然后在注销时使用id_token,否则浏览器允许"重播"。
    2. 您使用access_token来调用您的API(以与以前相同的方式),然后他们返回范围和声明。

      1. 客户端凭据身份验证第三个选项适用于无人(无用户登录)自动网络呼叫。在这种情况下,使用" Client Credentials"通过设置"秘密"登录到IDServ3在IDServ3中使用该秘密以及"客户端名称"在调用IDServ3以获取"范围"的列表时使用"声明",您的API可以决定授权或拒绝访问权限。
      2. 编辑:

        事实证明,API需要更多步骤才能使Authorize [Roles =" roles1,roles2"]正常工作。

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

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

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

        请求" id_token令牌"调用ui中的responsetype将在没有声明中的角色的情况下给出access_token。这是因为只有ScopeType = Resource的作用域附加到access_token。所以:

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