Blazor 托管 - 在显示应用程序之前立即授权
Blazor hosted - authorize immediately before displaying application
任何人都可以帮助我让我托管的 Blazor 应用程序(客户端、服务器和共享)在应用程序最初显示之前立即请求登录。我想要用户在访问应用程序之前必须登录的体验。
我的起点是具有 Api 授权(个人用户帐户)
的 Blazor Webassembly(托管)模板
在具有 Authorize
属性的特定 action/page 之前,在服务器端操作或客户端 Razor 页面上使用 Authorize
属性不会启动身份验证流程用户要求。在应用程序首次显示之前,我将如何首先启动授权流程?
我相信这对于比我更精明的人来说是可能的,甚至是微不足道的。谁能给我一个正确的方向,好吗?
我创建了一个控件RedirectToLogin.razor
@inject NavigationManager Navigation
@code {
protected override void OnInitialized()
{
String thisPage = Navigation.Uri.Replace(Navigation.BaseUri, "~/");
Navigation.NavigateTo($"Identity/Account/Login?returnUrl={thisPage}");
base.OnInitialized();
}
}
然后插入到mainlayout.razor
<div class="container-fluid">
<AuthorizeView>
<Authorized>
<NavigationLogger />
<ContextMenuMouseClick>
<MenuTopBar />
<NavMenu />
<SubPageContainer>
@Body
</SubPageContainer>
</ContextMenuMouseClick>
</Authorized>
<NotAuthorized>
<RedirectToLogin />
</NotAuthorized>
</AuthorizeView>
</div>
因此,当布局加载并处于 NotAuthorized 状态时,它将重定向到登录页面,授权后将 return 到它试图访问的页面。
希望对您有所帮助。
Blazor 客户端是从 wwwroot
中的静态 index.html
引导的。在服务器项目中,它映射到 Startup.cs
中的一个端点,基本上是对所有未被 Razor 页面或控制器采用的端点的包罗万象:
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllers();
endpoints.MapFallbackToFile("index.html");
});
对于您的场景:
- 在服务器中创建一个新布局,比如_LayoutBlazor.cshtml
从客户端重新创建 index.html
的内容。请注意,来自客户端的 _framework 文件在构建时被复制到服务器 wwwroot:
:
<app>Loading...</app>
<script src="@Href("~/_framework/blazor.webassembly.js")"></script>
创建一个新的 Razor 页面并在其上放置 "Authorize" 标签并使用 _LayoutBlazor。
从 Startup.cs
中删除 endpoints.MapFallbackToFile("index.html");
Mark Gould 在这里创建了一个概念证明:RazorBlazor
任何人都可以帮助我让我托管的 Blazor 应用程序(客户端、服务器和共享)在应用程序最初显示之前立即请求登录。我想要用户在访问应用程序之前必须登录的体验。
我的起点是具有 Api 授权(个人用户帐户)
的 Blazor Webassembly(托管)模板在具有 Authorize
属性的特定 action/page 之前,在服务器端操作或客户端 Razor 页面上使用 Authorize
属性不会启动身份验证流程用户要求。在应用程序首次显示之前,我将如何首先启动授权流程?
我相信这对于比我更精明的人来说是可能的,甚至是微不足道的。谁能给我一个正确的方向,好吗?
我创建了一个控件RedirectToLogin.razor
@inject NavigationManager Navigation
@code {
protected override void OnInitialized()
{
String thisPage = Navigation.Uri.Replace(Navigation.BaseUri, "~/");
Navigation.NavigateTo($"Identity/Account/Login?returnUrl={thisPage}");
base.OnInitialized();
}
}
然后插入到mainlayout.razor
<div class="container-fluid">
<AuthorizeView>
<Authorized>
<NavigationLogger />
<ContextMenuMouseClick>
<MenuTopBar />
<NavMenu />
<SubPageContainer>
@Body
</SubPageContainer>
</ContextMenuMouseClick>
</Authorized>
<NotAuthorized>
<RedirectToLogin />
</NotAuthorized>
</AuthorizeView>
</div>
因此,当布局加载并处于 NotAuthorized 状态时,它将重定向到登录页面,授权后将 return 到它试图访问的页面。
希望对您有所帮助。
Blazor 客户端是从 wwwroot
中的静态 index.html
引导的。在服务器项目中,它映射到 Startup.cs
中的一个端点,基本上是对所有未被 Razor 页面或控制器采用的端点的包罗万象:
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllers();
endpoints.MapFallbackToFile("index.html");
});
对于您的场景:
- 在服务器中创建一个新布局,比如_LayoutBlazor.cshtml
从客户端重新创建
index.html
的内容。请注意,来自客户端的 _framework 文件在构建时被复制到服务器 wwwroot: :<app>Loading...</app>
<script src="@Href("~/_framework/blazor.webassembly.js")"></script>
创建一个新的 Razor 页面并在其上放置 "Authorize" 标签并使用 _LayoutBlazor。
从 Startup.cs
中删除
endpoints.MapFallbackToFile("index.html");
Mark Gould 在这里创建了一个概念证明:RazorBlazor