Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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
.net Blazor WebAssembly+;亚马逊干邑_.net_.net Core_Amazon Cognito_Blazor_Blazor Client Side - Fatal编程技术网

.net Blazor WebAssembly+;亚马逊干邑

.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

我想通过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.
然后,将显示默认的“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>