我正在使用 Blazor Wasm 编写 SPA。我使用了标准模板并包含托管在服务器中的用户帐户,该服务器也创建了服务器应用程序。到目前为止一切都很好。
我想补充一点,我正在使用 .Net5 RC2,但我认为这不是我的问题。
我希望在服务器和客户端应用程序中都有一些“正常”的剃刀页面。用户帐户身份服务器创建了文件夹结构 /Areas/Identity/Pages/...
我添加了 /Areas/Management/Pages/Admin/Test.cshtml 和 Test.cshtml.cs
这些是非常简单的测试文件......
EDIT- 我对此进行了编辑以反映@enet 提出的问题。
剃须刀文件:
@page
@model ProjName.Server.Areas.Management.Pages.Admin.TestModel
<h1>Test Page</h1>
@if (User.Identity.IsAuthenticated)
{
@if (User.IsInRole("Administrator"))
{
<h2>User is Admin</h2>
}
else
{
<h2>User is not an admin</h2>
}
}
else
{
<h2>User is Not Authenticated</h2>
}
@{
}
.CS 文件:
namespace ProjName.Server.Areas.Management.Pages.Admin
{
[Authorize] <<<--- See case B.
public class TestModel : PageModel
{
public void OnGet()
{
}
}
}
我想看到页面显示用户是管理员,或者用户不是管理员。
情况A:如果删除[授权],页面将加载,但始终显示用户未授权。因此,页面正在呈现,简单的测试会产生“else”情况。
在情况 B 中:页面根本不会呈现。 (此页面无法正常工作! - 来自浏览器的消息)。所以,根据我的研究,在这一点上:Razor 页面授权约定
我改变了我的startup.cs:
services.AddRazorPages();
to this:
services.AddRazorPages(options =>
{
options.Conventions.AuthorizeAreaFolder("Management", "/Admin");
});
***我已经把上面的内容拿出来并重置为原来的样子***
当我这样做时,无论 .cs 文件中是否有 [Authorize],都会出现与情况 B 相同的结果。当您阅读文档时,我想这是有道理的。
所以我想我需要传回某种形式的授权令牌,或者?
身份页面不需要任何授权,因此这不是问题。
我的配置服务如下所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<RGDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDatabaseDeveloperPageExceptionFilter();
services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<RGDbContext>();
// This was put in to try to sort this https://github.com/dotnet/AspNetCore.Docs/issues/17517
//services.Configure<IdentityOptions>(options =>
// options.ClaimsIdentity.UserIdClaimType = ClaimTypes.NameIdentifier);
services.AddIdentityServer()
.AddApiAuthorization<ApplicationUser, RGDbContext>(options => {
options.IdentityResources["openid"].UserClaims.Add("name");
options.ApiResources.Single().UserClaims.Add("name");
options.IdentityResources["openid"].UserClaims.Add("role");
options.ApiResources.Single().UserClaims.Add("role");
});
services.AddAuthentication()
.AddIdentityServerJwt();
services.AddControllersWithViews();
//services.AddRazorPages();
services.AddRazorPages(options =>
{
options.Conventions.AuthorizeAreaFolder("Management", "/Admin");
});
.... more of my own stuff...
*** 导航到服务器页面是通过 NavMenu 中的按钮触发“onclick”事件来实现的:
private void ServerPageTest()
{
Navigation.NavigateTo("/Management/Admin/Test", true);
}
我有一种感觉,我在创业中缺少一些选择,任何想法。