【问题标题】:Blazor WebAssembly + Amazon CognitoBlazor WebAssembly + Amazon Cognito
【发布时间】:2020-09-02 19:52:21
【问题描述】:

我想设置一个通过 AWS Cognito 进行身份验证的 Blazor 客户端应用程序。

当我运行应用程序时,我没有重定向到登录页面,而是页面显示“正在授权...”几秒钟,而我在控制台中收到此错误:

The loading of “https://blazorapp.auth.eu-central-1.amazoncognito.com/login?…Q&code_challenge_method=S256&prompt=none&response_mode=query” in a frame is denied by “X-Frame-Options“ directive set to “DENY“.
This error page has no error code in its security info
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]
      Authorization failed.

然后,默认的“你好,世界!”显示索引页面(尽管据我了解,根据 App.razor 定义,未经身份验证的用户不应该看到它?)。如果我单击“登录”,我会在控制台中收到相同的错误,但几秒钟后,Cognito 托管的登录页面打开,我可以登录,我被重定向回我的应用程序,并且应用程序显示右上角是认证用户的信息,但是控制台又有点奇怪了:

info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]
      Authorization failed.
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[1]
      Authorization was successful.

问题 1

我怎样才能摆脱这些错误并让我的应用重定向到 Cognito 登录页面而不会延迟约 10 秒?

问题 2

为什么无论我是否通过身份验证,我的应用中的所有内容始终可见?好像App.razorAuthorizeRouteView 下的NotAuthorized 节点根本没有效果,除非我在这里混淆了一些东西

代码:

Program.cs

builder.Services.AddOidcAuthentication(options =>
{
    options.ProviderOptions.Authority = "https://cognito-idp.{aws-region}.amazonaws.com/{cognito-userpoolid}";
    options.ProviderOptions.ClientId = "{cognito-clientid}";
    options.ProviderOptions.ResponseType = "code";
    options.ProviderOptions.RedirectUri = "https://localhost:44306/authentication/login-callback";
    options.ProviderOptions.PostLogoutRedirectUri = "https://localhost:44306/authentication/logout-callback";
});

App.razor(从模板创建,没有修改)

<CascadingAuthenticationState>
    <Router AppAssembly="@typeof(Program).Assembly">
        <Found Context="routeData">
            <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
                <NotAuthorized>
                    @if (!context.User.Identity.IsAuthenticated)
                    {
                        <RedirectToLogin />
                    }
                    else
                    {
                        <p>You are not authorized to access this resource.</p>
                    }
                </NotAuthorized>
            </AuthorizeRouteView>
        </Found>
        <NotFound>
            <LayoutView Layout="@typeof(MainLayout)">
                <p>Sorry, there's nothing at this address.</p>
            </LayoutView>
        </NotFound>
    </Router>
</CascadingAuthenticationState>

我自己仅在Program.cs 中修改了对AddOidcAuthentication 的调用,在使用个人用户帐户创建 Blazor WebAssembly 应用程序时,Visual Studio 填充了所有其他文件。

我正在努力让它发挥作用,非常感谢有关此主题的任何帮助

编辑:

根据@aguafrommars 的回答,我已使用静态网站托管将网站发布到 Amazon S3,并将 Amazon CloudFront 作为 CDN,但是,已发布应用程序的行为与描述的本地行为完全相同

扩展问题:

问题 1 展开:

当页面显示“正在授权...”时,我只在控制台中收到描述的错误,Cognito 托管的 UI 不会呈现,只有当我点击“登录”时,我才会被重定向(有很大延迟)到Cognito 托管 UI,或者在没有重定向的情况下进行身份验证(如果我之前登录过),也许这个 GIF 可以解决问题:

我可能错了,但问题不是 Cognito 托管的 UI 拒绝在 iframe 中呈现吗?我的应用程序是否可以像最终那样重定向到托管的 UI?现在我必须等待X-Frame-Options 错误被抛出,点击“登录”,等待另一个X-Frame-Options 错误被抛出,最后我被重定向并且流程成功(在 gif 中 UI 没有' t 出现,因为我之前在会话中进行了身份验证)

问题 2 展开:

我想要实现的行为是,如果用户未经过身份验证,他们将看不到应用程序的任何部分,而是将他们重定向到 Cognito 托管的 UI,并且只有在经过身份验证后才能看到任何内容。我尝试在MainLayout.razor 中使用Authorize 属性,但结果始终是空白屏幕,我想提供一些代码和详细信息,但我相信该行为受到问题1中描述的错误的影响,所以我想先整理一下

【问题讨论】:

    标签: .net .net-core amazon-cognito blazor blazor-client-side


    【解决方案1】:

    响应 1:

    在显示授权消息时,应用会检查有效身份验证并设置自动更新令牌 iframe。如果您在浏览器上查看网络日志,您会看到此时发出的请求。
    当应用程序在发行版中运行时,它会更快。

    响应 2:

    您需要通过添加Authorize attribute 在要保护的页面上添加授权。

    @page "/"
    @attribute [Authorize]
    
    

    【讨论】:

    • 非常感谢您的回答,但是,我仍然无法使其正常工作。我相信我可能没有正确描述我的问题,我已经用其他详细信息更新了我的问题,希望有助于说明问题。有机会再看看吗?
    • 您是否在 cognito 中添加了 localhost:44306/authentication/login-callback 作为重定向 Uri?
    • 是的,我同时配置了loginlogout 重定向url,当应用程序最终调用Cognito 时它们工作得很好,回调处理没有问题。问题是应用程序尝试加载 iframe 失败,如我编辑的问题中所述
    • 嗯,cognito 目前不支持 iframe 静默更新,如果我读得好这个问题:github.com/amazon-archives/amazon-cognito-identity-js/issues/…
    • 在 Blazor 方面是否有任何方法或解决方法可以使其与 Cognito 一起使用(例如不使用 iframe)?我的整个基础设施都基于 AWS,我使用 Cognito 作为 API Gateway 的授权方,我真的很想在这个项目中使用 Blazor...
    【解决方案2】:

    我最终从 Cognito 切换到 Auth0 并从 Api Gateway 的 RestApi 升级到 HttpApi,其中包括内置的 JWT 授权器,我对这个变化非常满意。 Cognito 最终遇到了太多问题,但如果有人决心让它工作,请在接受的答案下检查@aguafrommars 的 cmets。

    【讨论】:

      【解决方案3】:

      遇到同样的问题并切换到 Azure B2C,这再次解决了该问题。链接到 AWS Cognito 作为身份验证提供程序时,身份验证库似乎存在问题。

      MS 提出的问题 - https://github.com/dotnet/aspnetcore/issues/22651

      【讨论】:

      • 查看 GitHub 中有关问题的评论。要使其与 Cognito 一起工作,需要构建客户端代码来处理细节,类似于 MSAL 代码。
      猜你喜欢
      • 2020-08-19
      • 2020-06-26
      • 2021-02-08
      • 2020-06-28
      • 1970-01-01
      • 2020-06-06
      • 2020-10-09
      • 2020-09-11
      相关资源
      最近更新 更多