我有一个Blazor服务器端应用程序,我想通过它实现AWS Cognito身份验证。目前,我正在使用nuget软件包:Amazon.AspNetCore.Identity.Cognito
和Amazon.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]
。