Blazor服务器端+ Cognito中的身份验证

时间:2020-09-02 15:29:49

标签: amazon-web-services blazor

我有一个Blazor服务器端应用程序,我想通过它实现AWS Cognito身份验证。目前,我正在使用nuget软件包:Amazon.AspNetCore.Identity.CognitoAmazon.Extensions.CognitoAuthentication在我创建的登录页面中手动对用户进行身份验证。我完全忽略了任何内置的身份验证功能,但它“有效”。

我不喜欢这种方法,相反,我也想使用其托管的登录UI以正确的方式实现Cognito。我遵循了几个示例just like this one,声称在Asp.Net Core应用程序中设置Cognito就像向Startup.cs添加一些函数调用一样简单。

使用Blazor,App.razor和其他页面中需要一些其他代码,以允许通过用户身份验证进行访问。我已将@attribute [Authorize]添加到所有相关页面,并相应地修改了我的App.razor文件。

问题,当我导航到需要用户验证的页面时,为什么不重定向到Cognito托管的登​​录UI?假设我已遵循链接示例中列出的说明,那么要完全实现Cognito,还需要做些什么?

如果以前有人成功完成此操作,那么我会满月寻求完整的说明。

假设我已经正确设置了用户/身份池,因为我可以手动成功登录(获取访问令牌,访问DynamoDB等)。

如有必要,我很乐意提供更多信息/代码。谢谢您的帮助。

修改

App.razor

<CascadingAuthenticationState>
    <Router AppAssembly="@typeof(Program).Assembly">
        <Found Context="routeData">
            <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
                <NotAuthorized>
                    @* TODO: redirect and login. *@
                </NotAuthorized>
                <Authorizing>
                    <h1>Authentication in progress</h1>
                    <p>Only visible while authentication is in progress.</p>
                </Authorizing>
            </AuthorizeRouteView>
        </Found>
        <NotFound>
            <LayoutView Layout="@typeof(MainLayout)">
                <p>Sorry, there's nothing at this address.</p>
            </LayoutView>
        </NotFound>
    </Router>
</CascadingAuthenticationState>

Startup.cs

public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            Task task;

            services.AddRazorPages();

            services.AddServerSideBlazor();

            services.AddMvc();

            services.AddControllersWithViews();
            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
            })
            .AddCookie()
            .AddOpenIdConnect(options =>
            {
                options.ResponseType = "code";
                options.MetadataAddress = "https://cognito-idp.<region>.amazonaws.com/<userpoolid>/.well-known/openid-configuration";
                options.ClientId = <clientid>;
            });

            services.AddCognitoIdentity();

            // some other services
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseAuthentication();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseHsts();
            }

            app.UseHttpsRedirection();

            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapBlazorHub();
                endpoints.MapFallbackToPage("/_Host");
            });
        }

同样,需要验证的页面顶部还有@attribute [Authorize]

0 个答案:

没有答案