身份服务器 4 OidcClient 使用另一个应用程序生成的令牌

Posted

技术标签:

【中文标题】身份服务器 4 OidcClient 使用另一个应用程序生成的令牌【英文标题】:Identity server 4 OidcClient using token generated by another application 【发布时间】:2019-12-21 12:21:06 【问题描述】:

大家好,如果我朝着正确的方向前进,我需要一些指导。 我有具有此设置的身份服务器客户端:

new Client
            
                ClientId = "XamarinAndAngularClient",
                ClientName = "Xamarin and Angular client(Code with PKCE)",
                RedirectUris = new List<string>
                
                "http://localhost:4200", 
                "http://localhost:4200/auth-callback" 
                ,
                PostLogoutRedirectUris =
                

                    "http://localhost:4200",
                    "https://localhost:4200",
                ,
                RequireClientSecret = false,
                AllowedGrantTypes = GrantTypes.Code,
                RequirePkce = true,
                AllowedScopes =
                
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    IdentityServerConstants.StandardScopes.Address,
                    "myprotectedeapi"
                ,

                AllowOfflineAccess = true,
                RefreshTokenUsage = TokenUsage.ReUse
            

Angular SPA 使用此客户端和 oidc-client-js,效果很好。我已添加 Xamarin 应用程序以使用具有以下设置的相同客户端:

var options = new OidcClientOptions
        
            Authority = "https://myidentityserver.com/",
            ClientId = "XamarinAndAngularClient",
            Scope = "openid profile address myprotectedeapi",
            //RedirectUri = "xamarinformsclients://callback",
            RedirectUri = "http://localhost:4200/auth-callback",
            Browser = browser,
            FilterClaims =  false,
            Flow = OidcClientOptions.AuthenticationFlow.AuthorizationCode,
            ResponseMode = OidcClientOptions.AuthorizeResponseMode.Redirect, 
        ;

Xamarin 表单设置的想法是将用户重定向到 Indentity 服务器登录屏幕,并且当他提供了重定向到 Angular SPA 所需的凭据时。当前,每次 oidc-client-js 返回错误时都会发生这种对 Angular 的重定向:在存储中找不到匹配的状态。我的问题是:我当前的想法/方法是否正确,如果没有,我可以做什么以从 Xamarin 回调“通知”oidc-client-js 代码(包含身份服务器生成的状态和会话状态)可以用吗?

【问题讨论】:

【参考方案1】:

这里的问题,正如库告诉你的那样,向authorize 端点发出第一个请求的应用程序确实必须与获得身份验证回调的应用程序相同,并且与发出后续请求的应用程序相同token 端点。

代码 + PKCE 流程不需要使用客户端密码,因为它保证执行第一个授权请求的同一个客户端执行第二个令牌请求(这就是 PKCE 所做的)。这里唯一的秘密不是秘密,它是您的redirect_uri,因此只有位于该 uri 上的应用程序才能完成流程。通过这种方式,我们验证了 client(您的 Angular SPA),而无需保密。

话虽如此,您可以在 Xamarin.Forms 上做的是调用您的 SPA 上的端点,从那里启动整个流程,这在维护方面也更方便,因为您只有将 oidc 配置保留在应用程序的一侧(角度 spa)。

我已经在 this previous answer

上解释了有关此流程的更多细节

【讨论】:

以上是关于身份服务器 4 OidcClient 使用另一个应用程序生成的令牌的主要内容,如果未能解决你的问题,请参考以下文章

UWP App 中的 IdentityModel.OidcClient 从 3.1.2 迁移到 4.0

OIDC 客户端 + 身份服务器 4,设置 max_age 静默令牌更新不起作用

连接到 Azure AD 时,UWP 中的 OIDCClient“指定的协议未知”异常

OidcClient.readSigninResponseState:在存储中找不到匹配的状态 - oidc-client-js (Angular)

Xamarin iOS OidcClient需要HTTPS(可能通过App Transport Security)

何时应使用服务器端和客户端 Facebook 身份验证流程?