在这里试图找到这个问题的答案:如何正确实现服务器端blazor自定义授权提供程序时,我遇到了一个新错误,我不确定如何解决。从@Henk Holterman的评论中获取模板:https://devblogs.microsoft.com/aspnet/blazor-webassembly-3-2-0-preview-2-release-now-available/我一直在努力发展一些理解如何实现web组装blazor&服务器端blazor,以及两者之间的区别。
在本地,我可以运行我的项目,一切都如预期,我可以登录注册并授权用户。一旦我将我的应用程序部署到IIS,我就开始在控制台中收到关于没有注册服务"AuthenticationStateProvider"的WASM错误。
当我第一次将我的应用程序部署到IIS时,关于IdentityServer部分的appsettings.json文件也出现了问题,我想知道我是否损坏了什么。我添加的唯一一个部分是"密钥"部分,因为我收到了没有定义密钥文件名的错误。这让我想到了这里的stackoverflow帖子:IdentityServer4在生产中不工作通过导出ssl证书以用作文件来帮助解决此问题,然后我将其包含在IIS上的项目目录中。
服务器端appsettings.json
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\mssqllocaldb;Database=aspnet-BlazorApp3.Server-A7F1C813-7F5D-4B96-8663-B8FA2E1472E8;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"IdentityServer": {
"Clients": {
"BlazorApp3.Client": {
"Profile": "IdentityServerSPA"
}
},
"Key": {
"Type": "File",
"FilePath": "CertName.pfx",
"Password": "CertPassword"
}
},
"AllowedHosts": "*"
}
服务器端blazor启动.cs我已经包含了应用程序。此处使用PathBase("客户端blazor"(,因为在IIS中,我的应用程序不在根节点上。它是站点的子节点。
public void ConfigureServices(IServiceCollection services)
{
services.AddLogging();
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddIdentityServer()
.AddApiAuthorization<ApplicationUser, ApplicationDbContext>();
services.AddAuthentication()
.AddIdentityServerJwt();
services.AddControllersWithViews();
services.AddRazorPages();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
app.UseWebAssemblyDebugging();
}
else
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UsePathBase("/client-side-blazor");
app.UseHttpsRedirection();
app.UseBlazorFrameworkFiles();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseIdentityServer();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllers();
endpoints.MapFallbackToFile("index.html");
});
}
客户端webassembly blazor程序.cs
public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("app");
builder.Services.AddBaseAddressHttpClient();
//builder.Services.AddAuthorizationCore();
builder.Services.AddApiAuthorization();
await builder.Build().RunAsync();
}
builder.Services.AddAuthorizationCore((在上面被评论掉了,我一直在尝试关注其他一些关于我当前问题的SO帖子。
客户端blazor index.html
<base href="/client-side-blazor/"/>
顺便说一句,在创建web程序集blazor项目时,发布什么项目仍然有点不清楚。在引用中,服务器端项目有客户端dll,这让我认为我应该发布服务器项目,但我从文档中了解到,我也可以单独部署/发布web程序集项目(可能是一个没有身份验证/授权的独立项目(。任何易于接受的额外有用信息都将不胜感激。
到目前为止,我在研究中使用的链接:
https://learn.microsoft.com/en-us/aspnet/core/blazor/?view=aspnetcore-3.1
https://learn.microsoft.com/en-us/aspnet/core/security/blazor/webassembly/standalone-with-authentication-library?view=aspnetcore-3.1
https://learn.microsoft.com/en-us/aspnet/core/security/blazor/webassembly/hosted-with-identity-server?view=aspnetcore-3.1
好的,所以我想在这里尝试几件事。我想展示我的发现,而不想发表杂乱无章的评论。
正在添加服务。AddAuthorizationCore((在服务器端blazor中启动.cs(并删除.vs文件夹并重新加载项目(回答了这篇SO文章,但引入了一个新问题。我的问题是,这真的有必要在服务器端blazor项目中进行吗,因为我关注的网站没有添加它。https://devblogs.microsoft.com/aspnet/blazor-webassembly-3-2-0-preview-2-release-now-available/
其次,我认为真正的问题是当我更改基本href标记时。如果我创建一个新项目,更改连接字符串并运行它,一切都很好。如果我停止应用程序,请更改
<base href="/client-side-blazor/"/>
(包括尾部斜线(并添加
app.UsePathBase("/client-side-blazor")
到服务器端blazor startup.cs,然后重新运行不再像以前那样工作的应用程序。并且对天气预报控制器的呼叫以401进行响应。
我用这个解决了这个问题:
services.AddScoped<CustomAuthenticationStateProvider>();
services.AddScoped<AuthenticationStateProvider>(s => s.GetRequiredService<CustomAuthenticationStateProvider>());
为了解决这个问题,我关闭了项目,删除了"obj"文件夹,重新加载了项目,一切都很好。
给John Dover打电话,他的回答让我想起了那个讨厌的文件夹。