【发布时间】: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.razor 中AuthorizeRouteView 下的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