gpt4 book ai didi

c# - Xamarin:从浏览器重定向到 native 应用程序不起作用

转载 作者:行者123 更新时间:2023-12-03 21:02:26 26 4
gpt4 key购买 nike

我遵循此文档以在我的 xamarin 应用程序中实现 oauth2 授权代码流:
https://docs.microsoft.com/de-de/xamarin/xamarin-forms/data-cloud/authentication/oauth

另外,我引用了这个教程来让它与 IdentityServer4 一起工作(我复制了 OAuth2Authenticator 类的扩展):
https://sinclairinat0r.com/2018/12/09/secure-data-access-with-identityserver4-and-xamarin-forms

当我启动 Loginflow 时,应用程序重定向到浏览器,我可以登录并允许访问用户数据。不幸的是浏览器(或者我猜是操作系统)没有重定向到我的应用程序。我猜我的重定向 url 有问题,但我不确定。任何有关为什么它不起作用的指针将不胜感激。

重定向 Uri 由 manifest.xml 中的确切包名称加上“:/oauth2redirect”组成。虽然可能很明显,但我想提一下,我用 ipadress 替换了我们身份服务器的实际 url。

private async void StartOAuth()
{

var authenticator = new OAuth2AuthenticatorEx("xamarin", string.Empty, "openid profile",
new Uri("https://ipadress:5001/connect/authorize"), new Uri("com.companyname.SApp:/oauth2redirect"), new Uri("https://ipadress:5001/connect/token"), null, true);


authenticator.Completed += OnAuthCompleted;
authenticator.Error += OnAuthError;

AuthenticationState.Authenticator = authenticator;

var presenter = new Xamarin.Auth.Presenters.OAuthLoginPresenter();
Debug.WriteLine("after presenter");
presenter.Login(authenticator);

Debug.WriteLine($"Button StartOAuth clicked!");
}

这是身份服务器对应的客户端
private static Client XamarinClient() => new Client
{
ClientId = "xamarin",
ClientName = "Xamarin",

AllowedGrantTypes = GrantTypes.Code,
AllowAccessTokensViaBrowser = true,
AlwaysIncludeUserClaimsInIdToken = true,

RequireClientSecret = false,

RequirePkce = true,

AccessTokenType = AccessTokenType.Jwt,
AccessTokenLifetime = 60,

// Custom URL for native Apps. The URL below corresponds to bundle identifier
// on iOS and package name on Android
RedirectUris =
{
"com.companyname.SApp:/oauth2redirect",
},

AllowedScopes =
{ "openid", "profile" },
};

忘记发布我的 CustomUrlSchemeInterceptorActivity:
using System;
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.OS;
using SApp.Services;

namespace OAuthNativeFlow.Droid
{
[Activity(Label = "CustomUrlSchemeInterceptorActivity", NoHistory = true, LaunchMode = LaunchMode.SingleTop)]
[IntentFilter(
new[] { Intent.ActionView },
Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
DataSchemes = new[] { "com.companyname.SApp" },
DataPath = "/oauth2redirect")]
public class CustomUrlSchemeInterceptorActivity : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);

// Convert Android.Net.Url to Uri
var uri = new Uri(Intent.Data.ToString());

// Load redirectUrl page
AuthenticationState.Authenticator.OnPageLoading(uri);

Finish();
}
}
}

编辑:我将 Uris 更改为 http 并使用 whireshark 来捕获应触发重定向到应用程序的服务器响应。对我来说看起来不错,但也许它有帮助:
Frame 5009: 541 bytes on wire (4328 bits), 541 bytes captured (4328 bits) on interface 0
Ethernet II, Src: IntelCor_df:44:bd (28:16:ad:df:44:bd), Dst: Cisco_9f:f0:15 (00:00:0c:9f:f0:15)
Internet Protocol Version 4, Src: x.x.x.x, Dst: x.x.x.x
Transmission Control Protocol, Src Port: 5000, Dst Port: 38378, Seq: 9204, Ack: 4575, Len: 487
Hypertext Transfer Protocol
HTTP/1.1 302 Found\r\n
[Expert Info (Chat/Sequence): HTTP/1.1 302 Found\r\n]
Response Version: HTTP/1.1
Status Code: 302
[Status Code Description: Found]
Response Phrase: Found
Date: Wed, 05 Jun 2019 07:55:06 GMT\r\n
Server: Kestrel\r\n
Content-Length: 0\r\n
[Content length: 0]
[truncated]Location: http://ipaddress:5000/Account/Login?ReturnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Fclient_id%3Dxamarin%26redirect_uri%3Dcom.companyname.SApp%253A%252Foauth2redirect%26scope%3Dopenid%2520profile%26response_type%3Dcode
\r\n
[HTTP response 4/5]
[Time since request: 0.079050000 seconds]
[Prev request in frame: 4993]
[Prev response in frame: 5002]
[Request in frame: 5007]
[Next request in frame: 5010]
[Next response in frame: 5015]
[Request URI [truncated]: http://ipaddress:5000/Account/Login?ReturnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Fclient_id%3Dxamarin%26redirect_uri%3Dcom.companyname.SApp%253A%252Foauth2redirect%26scope%3Dopenid%2520profile%26response_type%3Dc]



更新 1:在尝试了几件事并与同事交谈之后,我想我至少已经确定身份服务器不是问题的一部分。此外,我必须使用 https 和 OAuth2Authenticator 类的上述扩展名,否则我无法达到浏览器应重定向到应用程序的地步。当我到达浏览器向我显示“您现在将被重定向”的点时,没有任何 react 。如果我手动关闭选项卡,我在 OnAuthCompleted 中的断点会触发,但 EventArgs 基本上是空的(帐户为空且 IsAuthenticated 为假)。我的 CustomUrlInterceptor 中的断点永远不会触发,这可能意味着我对重定向意图的实现是问题或重定向 uri 本身。不幸的是,我没有想法。我什至尝试将以下内容手动添加到 Manifest.xml,取自 Xamarin.Auth github:
<activity android:label="ActivityCustomUrlSchemeInterceptor"
android:launchMode="singleTop" android:noHistory="true" android:name="md52ecc484fd43c6baf7f3301c3ba1d0d0c.ActivityCustomUrlSchemeInterceptor">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:path="/oauth2redirect" />
<data android:scheme="com.companyname.SApp" />
</intent-filter>
</activity>

自签名证书可能是问题吗?由于目前身份服务器的配置变化非常频繁,我们还没有将其部署到 azure。今天,我开始在我的笔记本电脑上本地运行服务器,并通过本地网络从平板电脑与应用程序进行连接。

更新 2:我们确实将我们的 identityserver4 部署到 azure,遗憾的是没有太大变化。出于某种原因,我的 CustomUrlInterceptor 仍然没有被调用。然而,我确实找到了一种通过 adb 手动触发它的方法
adb shell am start -a android.intent.action.VIEW -d "com.companyname.SApp:/oauth2redirect" com.companyname.SApp

一旦我这样做,我就会得到 Xamarin.Auth.AuthException: Error authenticating: invalid_grant我仍在调查我突然收到 invalid_grant 的原因,但浏览器没有将控制权交还给应用程序的主要问题仍然存在。

另一个让我感到困惑的行为是,当我在应用程序关闭时执行上面的 adb 命令时,它会启动应用程序并立即向我显示一个屏幕,表明应用程序已停止工作。当我在获得浏览器的重定向屏幕后执行命令时(基本上是在应该发生重定向时强制重定向)我在 CustomUrlInterceptor 中到达我的断点,然后我进入 OnAuthError 方法,然后应用程序关闭/崩溃。我明白为什么它会在第一种情况下崩溃,而在第二种情况下不会。

最佳答案

在文件 CustomUrlSchemeInterceptorActivity 上将 DataSchemes 从“com.companyname.SApp”更改为您的 GoogleRedirectLink:
例子:
com.googleusercontent.apps.1093596514437-d3rpjj7clslhdg3uv365qpodsl5tq4fn

关于c# - Xamarin:从浏览器重定向到 native 应用程序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56444946/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com