【问题标题】:Angular App Hosting Azure Storage Container - Azure Authentication Callback and Routing failsAngular 应用托管 Azure 存储容器 - Azure 身份验证回调和路由失败
【发布时间】:2020-05-06 04:36:54
【问题描述】:

我使用 NgxAdmin 开发了一个 Angular 8 应用程序并将其托管为 Azure Web 应用程序。它在 NbAuthModule 的帮助下使用 Azure AD Oauth2 身份验证。一切正常。 现在我尝试在 Azure 存储帐户上托管相同的 SPA。我将新的回调 url 添加到 Azure 广告应用注册并更新了 NbOAuth2AuthStrategy.setup-method 中的 redirectUri。

当我调用静态应用程序的基本 URL (https://<projectname>.z6.web.core.windows.net) 时,它会正确重定向到 https://<projectname>.z6.web.core.windows.net/auth/login?return=%2Fpages%2Fdashboard。 我可以通过 Azure Ad 登录。然后 url 更改为 https://<projectname>.z6.web.core.windows.net/auth/callback#access_token=eyJ0eXAiOiJKV1Q... 并且应该重定向到之前定义的 return-url /pages/dashboard。但我得到的只是回调链接上的 404。

此外,如果我尝试打电话,例如直接https://<projectname>.z6.web.core.windows.net/auth/login,它返回一个404(如果我对web应用做同样的事情,就会显示登录组件)。

我做错了什么?是否需要在我的 Angular 代码中进行其他更改以使路由在 Azure 存储帐户中运行?

【问题讨论】:

    标签: angular azure azure-authentication azure-storage-account


    【解决方案1】:

    您似乎没有使用HashLocationStrategy,因此404 可能是因为网络服务器在auth/callback 中没有任何文件夹/文件。你有两个选择:

    1. 将您的网络服务器配置为在获得像auth/callback 这样的子路由时重定向到{root}/index.html
    2. Use the HashLocationStrategy,它将在您的路由前加上#,例如:

    https://<projectname>.z6.web.core.windows.net/#/auth/callback?access_token=eyJ0eXAiOiJKV1Q

    https://<projectname>.z6.web.core.windows.net/#/auth/login?return=/#/pages/dashboard

    以下是启用哈希定位策略的方法:

    @NgModule({   
        imports: [
          /* more imports here */
          RouterModule.forRoot(routes, { useHash: true })
        ],   
        declarations: [
           /* components here */ 
        ],
        providers: [   
           /* services here */ 
        ],
        bootstrap: [ AppComponent ]
     }) 
     export class AppModule { }
    

    【讨论】:

    • 我不太熟悉重新编写模块以正确重定向,但我发现了另一个可能对您有所帮助的问题。 stackoverflow.com/questions/38209656/…
    • 感谢您的分析!请看看我对 Nimezzz 的回答的 cmets
    • 对不起,我最初在 HashLocationStrategy 示例中提供的 URL 有误,我已对其进行了编辑以更正问题。应该有一个“?”表示“access_token”是一个查询字符串参数。根据您对另一个问题的 cmets,这就是网址不起作用的原因。
    • 另外,如果您使用的是 HashLocationStrategy,则不需要实现重写模块。
    • 不幸的是,如果我在 app.module 中的 redirectUri 末尾添加一个问号,我还必须将它添加到 azure ad app 配置中作为重定向 uri。但我不能用 ?在 azure 广告中,它抱怨它不是一个有效的 url。
    【解决方案2】:

    当您将 Angular 应用程序部署到服务器时,您需要重写 URL 才能使用路由。 我假设您使用的是 iis 服务器并将以下内容添加到 web.config

    <system.webServer>
     <rewrite>
        <rules>
          <rule name="Angular Routes" stopProcessing="true">
            <match url=".*" />
            <conditions logicalGrouping="MatchAll">
              <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
              <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
            </conditions>
            <action type="Rewrite" url="/index.html" />
          </rule>
        </rules>
      </rewrite>
    </system.webServer>
    

    Source

    或者您可以添加 Hash Location 策略,这会在路由开始前生成 #(例如:https://sample.com/#/login

    在 app.module.ts 中

    import {LocationStrategy, HashLocationStrategy} from '@angular/common';
    

    导入后向提供者添加以下行。

    {provide: LocationStrategy, useClass: HashLocationStrategy}
    

    例如:

    providers: [AuthService, 
                AuthGuard, 
                FlxUiDataTable,
                {provide: LocationStrategy, useClass: HashLocationStrategy}] 
    

    Source

    希望这会有所帮助。谢谢

    【讨论】:

    • 感谢您的回答。不,我不使用 iis - 我将 Angular 应用程序作为静态网站部署到 azure 存储帐户。我按照建议添加了哈希位置策略,但它仍然不起作用:-(
    • 好吧,我现在进步了。我做了一些额外的更改:
    • 1.将我的 app.module 中的重定向 url 更改为 redirectUri:${environment.frontend.baseUrl}/#/auth/callback 2. 将 azure 活动目录中的应用注册中的回调 uri 更改为 https://&lt;projectname&gt;.z6.web.core.windows.net/#/auth/callback 3. 将 useHash: trueconfig 添加到 RouterModule 导入中。不,我不再获得 404。但相反有一个不同的错误:
    • https://&lt;projectname&gt;.z6.web.core.windows.net/auth/callback#access_token=eyJ0eXAiOiJKV1Q...已更改为https://&lt;projectname&gt;.z6.web.core.windows.net/#access_token=eyJ0eXAiOiJKV1Q...。应该是:https://&lt;projectname&gt;.z6.web.core.windows.net/#/auth/callback#access_token=eyJ0eXAiOiJKV1Q... 似乎对 url 中的两个主题标签有些混淆。我该如何解决这个问题?
    • 将“callback#access_token”更改为“callback?access_token” - 我已经更正了我的答案以澄清。
    猜你喜欢
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 2022-10-17
    • 1970-01-01
    • 2021-09-24
    • 2020-11-06
    • 1970-01-01
    相关资源
    最近更新 更多