Xamarin.Auth 或 IdentityModel + IdentityServer4

Posted

技术标签:

【中文标题】Xamarin.Auth 或 IdentityModel + IdentityServer4【英文标题】:Xamarin.Auth or IdentityModel + IdentityServer4 【发布时间】:2019-07-26 19:56:17 【问题描述】:

是否有人使用 Xamarin.Auth 或 IdentityModel 实现了 IdentityServer4 身份验证? 我尝试过同时使用 IdentityModel 和 Xamarin.Auth,但从外观上看,它们都缺少一些功能。

    我似乎找不到在 Xamarin.Auth 的 OAuth2Authenticator 中设置 response_type 和 response_mode 的方法。 但我喜欢如何打开本机浏览器并收听其完成/错误事件。在这种情况下,对于未经授权的客户端来说显然会出错,因为我们在 .Net Core 中的 IdentityServer4 需要 response_type 和 response_mode。

    我似乎找不到使用 IdentityModel 与本机浏览器交互的方法。我读到推荐的方法是使用外部/本机浏览器而不是 web 视图。除此之外,我在使用 webview 尝试向 google 进行身份验证时收到 disallowed_useragent 错误。

【问题讨论】:

【参考方案1】:

已解决。我最终使用 Xamarin.Auth 与 IdentityServer4 一起工作(至少目前在 ios 中),因为 Google 身份验证(不是 android)对使用带有 IdentityModel 的 WebView 不满意。

其他开发人员可能会遇到与使用 IdentityServer4 的 OAuth2Authenticator 类似的问题的注意事项,以下是发生的事情以及对我有用的事情:

    原来在 IdentityServer4 中不需要 response_type 和 response_mode,因为我们在服务器中有默认设置。

    我的主要问题是当 Xamarin.Auth 请求令牌时出现“client_unauthorized”错误,因为 RedirectUrl 末尾有斜线,而配置的 RedirectUrl 没有。

    初始化 OAuth2Authenticator 时,我的 RedirectUrl 末尾没有斜杠 在调用 OneListAppContext.AuthenticationState.Authenticator.OnPageLoading(url) 之前,我在 AppDelegate.cs 中的 OpenUrl 方法内将 NSUrl 转换为 Uri 时,神奇地添加了末尾的额外斜线。 我想在 url 查询中的问号前有一个斜线是一个标准吗?如果是,我不知道,因为在 url 中添加 ?name=value 总是有效的。 在 OpenUrl 方法中来自 Safari 的 NSUrl 是 myappname://oauth?code=1ec450f88737fcae0a2786699d5df24e3ca97a8b55c09da2ef13d58035821134... 将 NSUrl 转换为 Uri 后的新 Uri 是 myappname://oauth/?code=1ec450f88737fcae0a2786699d5df24e3ca97a8b55c09da2ef13d58035821134...(注意在 oauth 之后有 /)

修复非常简单: 1. 将我的客户端配置的 RedirectUrl 更改为以 / 结尾(例如 myappname://oauth/) 2. 在客户端初始化 RedirectUrl 以使 OAuth2Authentic 以 / 结尾(例如 myappname://oauth/)

【讨论】:

以上是关于Xamarin.Auth 或 IdentityModel + IdentityServer4的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Auth:使用 Facebook oauth,如何重定向到我的应用程序?

如何从Xamarin Auth-Google获得访问令牌

Xamarin.Auth OAuth Google API,用于Android的用户身份验证

在 Xamarin Forms 中存储密钥

Java.Lang.ClassNotFoundException WebAuthenticatorActivity

尝试在使用OAuth演示者时显示UINavigationController