.net Blazor WebAssembly+;亚马逊干邑
我想通过AWS Cognito设置一个具有身份验证的Blazor客户端应用程序 当我运行应用程序时,我不会被重定向到登录页面,相反,该页面会在几秒钟内显示“授权…”,而我在控制台中遇到以下错误:.net Blazor WebAssembly+;亚马逊干邑,.net,.net-core,amazon-cognito,blazor,blazor-client-side,.net,.net Core,Amazon Cognito,Blazor,Blazor Client Side,我想通过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” i
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.
然后,将显示默认的“Hello,world!”索引页(尽管据我所知,根据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
中authorizedRouteView
下的NotAuthorized
节点没有任何效果,除非我在这里混淆了什么
代码:
Program.cs
App.razor(根据模板创建,无需修改)
@如果(!context.User.Identity.IsAuthenticated)
{
}
其他的
{
您无权访问此资源
}
对不起,这个地址什么也没有
我自己只修改了Program.cs
中对AddOidcAuthentication
的调用,所有其他文件都是在使用个人用户帐户创建Blazor WebAssembly应用程序时由Visual Studio填充的
我正在努力使这项工作,并将非常感谢任何帮助这个话题
编辑:
根据@aguafrommars的回答,我已经使用静态网站托管将网站发布到Amazon S3,Amazon CloudFront作为CDN,但是,发布的应用程序的行为与描述的本地行为完全相同
要详细说明这些问题:
问题1展开:
当页面显示“授权…”时,我只会在控制台中得到描述的错误,Cognoto托管的UI不会呈现,只有当我单击“登录”时,我被重定向(延迟较大)到Cognoto托管的UI,或者在没有重定向的情况下进行身份验证(如果我之前登录),此GIF可能会清除问题:
我可能错了,但问题不在于托管Cognito的UI拒绝在iframe中呈现吗?我的应用程序能否像最终一样,首先重定向到托管UI?现在我必须等待X-Frame-Options
错误被抛出,单击“登录”,等待另一个X-Frame-Options
错误被抛出,最后我被重定向,流成功(在gif中,UI不会显示,因为我在会话中验证过)
问题2展开:
我想要实现的行为是,如果用户没有经过身份验证,他们就看不到应用程序的任何部分,相反,他们被重定向到Cognito托管的UI,只有经过身份验证之后,他们才能看到任何东西。我试图在MainLayout.razor
中使用Authorize
属性,但结果总是一个空白屏幕,我想提供一些代码和详细信息,但我相信该行为会受到问题1中描述的错误的影响,这就是为什么我想首先对其进行排序回答1:
显示授权消息时,应用程序将检查有效的身份验证并设置自动续订令牌iframe。如果查看浏览器上的网络日志,您将看到此时发出的请求。当应用程序在发行版中运行时,速度会更快 答复2: 您需要在要通过添加来保护的页面上添加授权
@page/“
@属性[授权]
我最终从Cognito切换到了Auth0,并从Api Gateway的RestApi升级到了HttpApi,其中包括内置的JWT authorizer,我对这一变化非常满意。Cognito最终遇到了太多问题,但如果有人决定让它工作,请检查@aguafrommars在接受答案下的评论。也遇到了同样的问题,并切换到Azure B2C,这再次解决了问题。当链接到AWS Cognito作为身份验证提供程序时,身份验证库似乎有问题
向女士提出的问题-
非常感谢您的回答,但是我仍然无法让它起作用。我相信我可能没有正确地描述我的问题,我已经用更多的细节更新了我的问题,希望这将有助于说明问题。你有没有可能再看一眼?你在cognito中添加了重定向Uri?是的,我配置了
登录
和注销
重定向URL,当应用程序最终调用cognito时,它们工作得很好,回调处理没有问题。问题是应用程序试图加载iframe,但未能加载iframe,如我编辑的问题Hummm中所述,如果我阅读得很好,cognito目前不支持iframe静默更新:Blazor端是否有任何方法或解决方法使其与cognito一起工作(例如,不使用iframe)?我的整个基础设施都是基于AWS的,我使用Cognito作为API网关的授权人,我真的很想在这个项目中使用Blazor……请参阅GitHub中对这个问题的评论。要使其与Cognito协同工作,需要构建客户端cod
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";
});
<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>