Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有React应用程序的ASP.NET标识在OAuth2回调上中断_C#_Reactjs_Asp.net Core_Asp.net Identity - Fatal编程技术网

C# 带有React应用程序的ASP.NET标识在OAuth2回调上中断

C# 带有React应用程序的ASP.NET标识在OAuth2回调上中断,c#,reactjs,asp.net-core,asp.net-identity,C#,Reactjs,Asp.net Core,Asp.net Identity,我使用创建了一个已安装的web应用程序。React应用程序负责所有用户交互,dotnet应用程序仅用作API。我使用Microsoft.AspNetCore.authentication提供的services.AddAuthentication().AddGooglebuilder扩展集成了Google OAuth2身份验证选项。最后,整个过程被容器化并部署到Azure上的Linux应用程序服务中 我的大部分代码都是从以前的版本移植过来的,这是一个非常类似的设置,但在这种情况下,我将自定义Rea

我使用创建了一个已安装的web应用程序。React应用程序负责所有用户交互,dotnet应用程序仅用作API。我使用Microsoft.AspNetCore.authentication提供的
services.AddAuthentication().AddGoogle
builder扩展集成了Google OAuth2身份验证选项。最后,整个过程被容器化并部署到Azure上的Linux应用程序服务中

我的大部分代码都是从以前的版本移植过来的,这是一个非常类似的设置,但在这种情况下,我将自定义React应用程序添加到现有的ASP.NET应用程序中,而不是从dotnet的官方React项目模板开始。当时一切都很顺利。但我在部署到Azure时面临新版本的问题。这里有一个提琴手跟踪来突出问题:

vault2
是身份识别服务的客户端
identity azure
是identity Server应用程序。此跟踪显示的流程如下所示:

  • 用户在Vault应用程序上单击“登录”
  • 浏览器被重定向到标识应用程序
  • 用户单击Google按钮启动OAuth2流
  • 用户使用Google帐户登录
  • 用户被重定向到默认的回调URL(
    https://identity-azure..com/signin-google?state=...
  • 这最后一步就是问题所在。您会注意到,在Fiddler跟踪中看不到回调URL,而是看到了几个其他请求(例如,
    service worker.js
    ),它们显然是从React应用程序发出的。因此,
    登录google
    路径是由浏览器的缓存React应用程序而不是服务器处理的。React应用程序使用
    React router redux
    在客户端处理某些路由,当然
    signin google
    不是其中之一,因此它似乎返回了一个空组件

    据我所知,我的所有ASP.NET路由(使用
    Route
    属性来修饰控制器操作方法实现)都由服务器一致地处理。然而,
    signin google
    路由是在身份验证中间件中实现的,据我所知,除了更改路径之外,我对它没有太多控制权。我能做些什么来强制服务器端处理这个问题吗


    我应该补充一点,这种行为相当不稳定。似乎如果我的Google帐户已签出,则会观察到上述情况,但如果我的帐户已签入,则登录Google将返回预期的302状态代码,OAuth2流将成功继续

    我终于弄明白发生了什么事。至少,我想我有。我不能确定,因为我已经将React UI分解成一个完全独立的应用程序,但我在那里观察到了类似的模式。我原来的问题中甚至有一条线索!事实证明,断页实际上是由React应用程序的服务人员提供的。我发现了这一点,因为即使在将React应用程序拆分为自己的域后,我的
    identity azure
    域仍然是一个纯ASP.NET Web API,在
    identity azure
    下请求某些URL的行为仍然相同,我最终注意到它们在我浏览器的网络选项卡上报告自己由
    ServiceWorker
    提供服务。下面的例子

    我一清除浏览器应用程序缓存(在Windows上的Chrome中,这是
    F12>应用程序>清除存储>清除站点数据
    ,并选中
    注销服务人员

    如果我将React应用程序保留在与ASP.NET后端相同的解决方案中,我无法100%确定解决方案是什么,但我认为这可能会涉及。我希望这对将来的人有所帮助


    顺便说一下,如果您正在考虑为Identity Server 4构建一个完全解耦的UI,那么有一个。

    是什么让您认为React是以某种方式处理对不同子域的调用的?不是。
    signin google
    Identity azure
    子域上的回调URN。它是ASP.NET的google OA的默认回调路径uth集成。为清晰起见,
    vault2
    也是一个React应用程序,但该应用程序按预期工作。