我在try 将Ffltter应用程序连接到SignalR时遇到身份验证问题.后端服务器正确地接收令牌,但是到集线器集的连接被验证为FALSE.我try 了各种方法,但都没有成功.任何帮助都将不胜感激.谢谢!

Package used

flutter doctor -v:

[√] Flutter (Channel master, 3.16.0-5.0.pre.15, on Microsoft Windows [Version 10.0.22621.2283], locale en-US)
    • Flutter version 3.16.0-5.0.pre.15 on channel master at C:\src\flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision fe0275f9d5 (22 hours ago), 2023-10-05 05:57:26 -0400
    • Engine revision f8d53c5fe9
    • Dart version 3.2.0 (build 3.2.0-231.0.dev)
    • DevTools version 2.28.1

[√] Windows Version (Installed version of Windows is version 10 or higher)

[√] Android toolchain - develop for Android devices (Android SDK version 33.0.2)
    • Android SDK at C:\Users\muonroi\AppData\Local\Android\Sdk
    • Platform android-33-ext5, build-tools 33.0.2
    • Java binary at: C:\Program Files\Android\Android Studio\jbr\bin\java
    • Java version OpenJDK Runtime Environment (build 11.0.15+0-b2043.56-9505619)
    • All Android licenses accepted.

[√] Chrome - develop for the web
    • Chrome at C:\Program Files\Google\Chrome\Application\chrome.exe

[√] Visual Studio - develop Windows apps (Visual Studio Enterprise 2022 17.6.5)
    • Visual Studio at C:\Program Files\Microsoft Visual Studio\2022\Enterprise
    • Visual Studio Enterprise 2022 version 17.6.33829.357
    • Windows 10 SDK version 10.0.22000.0

[√] Android Studio (version 2022.1)
    • Android Studio at C:\Program Files\Android\Android Studio
    • Flutter plugin can be installed from:
       https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
       https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 11.0.15+0-b2043.56-9505619)

[√] VS Code (version 1.83.0)
    • VS Code at C:\Users\muonroi\AppData\Local\Programs\Microsoft VS Code
    • Flutter extension version 3.74.0

[√] Connected device (4 available)
    • Android SDK built for x86 (mobile) • emulator-5554 • android-x86    • Android 10 (API 29) (emulator)
    • Windows (desktop)                  • windows       • windows-x64    • Microsoft Windows [Version 10.0.22621.2283]
    • Chrome (web)                       • chrome        • web-javascript • Google Chrome 117.0.5938.134
    • Edge (web)                         • edge          • web-javascript • Microsoft Edge 117.0.2045.47

[√] Network resources
    • All expected network resources are available.

• No issues found!

Code connect to hub

// Flutter code to connect to the hub
await _initSharedPreferences();
_hubConnection = HubConnectionBuilder()
    .withUrl(
        SignalrCentral.chatStatus,
        options: HttpConnectionOptions(
            accessTokenFactory: () async {
                return _sharedPreferences
                    .getString(KeyToken.accessToken.name)!;
            },
            headers: SignalrCentral.getHeader(
                _sharedPreferences.getString(KeyToken.encToken.name)!)))
    .withAutomaticReconnect(retryDelays: [30000])
    .build();
await initHubAndListenStatus();

Future<void> initHubAndListenStatus() async {
    try {
        await _hubConnection.start();
        debugPrint('Connection established successfully');
    } catch (e) {
        print('Error starting hub connection: $e');
    }
}

Code backend server

/* This method is needed to authorize SignalR javascript client.
         * SignalR can not send authorization header. So, we are getting it from query string as an encrypted text. */
        private static Task QueryStringTokenResolver(MessageReceivedContext context)
        {
            if (context.HttpContext.Request.Path.Value.StartsWith("/signalr"))
            {
                var env = context.HttpContext.RequestServices.GetService<IWebHostEnvironment>();
                var config = env.GetAppConfiguration();
                var allowAnonymousSignalRConnection = bool.Parse(config["App:AllowAnonymousSignalRConnection"]);

                return SetToken(context, allowAnonymousSignalRConnection);
            }

            List<string> urlsUsingEnchAuthToken = new List<string>()
            {
                "/Chat/GetUploadedObject?",
                "/Profile/GetProfilePictureByUser?"
            };

            if (urlsUsingEnchAuthToken.Any(url => context.HttpContext.Request.GetDisplayUrl().Contains(url)))
            {
                if (context.HttpContext.Request.Headers.ContainsKey("authorization"))
                {
                    return Task.CompletedTask;
                }

                return SetToken(context, false);
            }

            return Task.CompletedTask;
        }


        private static Task SetToken(MessageReceivedContext context, bool allowAnonymous)
        {
            var qsAuthToken = context.HttpContext.Request.Query["enc_auth_token"].FirstOrDefault() ?? context.HttpContext.Request.Headers["enc_auth_token"].FirstOrDefault();
            if (qsAuthToken == null)
            {
                if (!allowAnonymous)
                {
                    throw new AbpAuthorizationException("SignalR auth token is missing.");
                }

                return Task.CompletedTask;
            }
            //Set auth token from cookie
            context.Token = SimpleStringCipher.Instance.Decrypt(qsAuthToken, AppConsts.DefaultPassPhrase);
            return Task.CompletedTask;
        }```

推荐答案

我解决了身份验证时发送附加参数"enc_auth_Token"(加密的访问令牌)的问题

Csharp相关问答推荐

在Microsoft XNA框架(MonoGame)中旋转相机

PredicateBuilder不是循环工作,而是手动工作

在Dapper中使用IasyncEum重写GetAsyncEum方法

在C#中使用in修饰符

将修剪声明放入LINQ中

Blazor-从数据库内部服务器提取错误

具有单一导航属性的EF核心一对多关系

使用C#HttpClient以多部分形式数据发送带有非ASCII文件名的文件的问题

如何解决提交按钮后 Select 选项错误空参照异常

在实体框架中处理通用实体&S变更跟踪器

Blazor在FluentButton onClick事件上设置参数

显示文档的ECDsa签名PDF在Adobe Reader中签名后已被更改或损坏

如何将MemberInitExpression添加到绑定中其他Lambda MemberInitExpression

如何让两个.NET版本不兼容的项目对话?

如何返回具有泛型的类?

如何从另一个类的列表中按ID取值

.NET8->;并发词典总是比普通词典快...怎么回事?[包含基准结果和代码]

为什么ReadOnlySpan;T&>没有Slice(...)的重载接受Range实例的?

无法通过服务控制台启动.NET Core 6.0服务(错误1053)

XmlSerializer在遇到XML属性(命名空间)时崩溃