我有一个"Blazer Web assembly";带有登录页面(组件(和忘记密码页面(组件(Component((的应用程序。
当我点击";忘记密码";登录页面上的链接,而不是将我发送到";忘记密码";页面,它会再次将我发送回登录页面。
这是我的代码:
应用程序Razor
<CascadingAuthenticationState>
<Router AppAssembly="@typeof(App).Assembly">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
<NotAuthorized>
</NotAuthorized>
</AuthorizeRouteView>
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
</LayoutView>
</NotFound>
</Router>
</CascadingAuthenticationState>
MainLayout.razor:
@inherits LayoutComponentBase
<AuthorizeView>
<Authorized>
<NavBar>
<NavBarLeft>....
@code {
[CascadingParameter]
Task<AuthenticationState> AuthenticationState { get; set; }
protected override async Task OnParametersSetAsync()
{
navBarLeftInjectableMenu.SetContent(null, false);
if (!(await AuthenticationState).User.Identity.IsAuthenticated)
{
NavigationManager.NavigateTo("/login");
}
}
忘记密码页面:
@page "/ForgotPass"
@layout AuthLayout
<div class=....
登录页面:
@layout AuthLayout
@page "/LoginX"
@inject NavigationManager NavigationManager
<div class="hold-transition login-page">
<div class="login-box">
<button @onclick="ForgotPassword" class="btn btn-primary btn-block">Forgot Password</button>
</div>
</div>
@code {
void ForgotPassword()
{
NavigationManager.NavigateTo("/ForgotPassX", true);
}
}
AuthLayout.razor:
@inherits LayoutComponentBase
<div class="main">
<div class="content px-4">
@Body
</div>
</div>
HttpInterceptor:
private async Task InterceptBeforeSendAsync(object sender, HttpClientInterceptorEventArgs e)
{
var absolutePath = e.Request.RequestUri != null? e.Request.RequestUri.AbsolutePath : string.Empty;
if (!absolutePath.Contains("token") && !absolutePath.Contains("acc"))
{
var token = await _refreshTokenService.TryRefreshToken();
if (!string.IsNullOrEmpty(token))
{
e.Request.Headers.Authorization =
new AuthenticationHeaderValue("bearer", token);
}
}
}
您有两个选项:
1/将@attribute [AllowAnonymous]
放入您忘记的密码页面。
2/创建一个不需要授权的不同布局,然后将其用于您忘记的密码页面,如@layout AnonymousLayout
这是因为您每次请求时都会调用OnParametersSetAsync
方法,并且您的判断条件会强制指向Login
页面。
您可以添加一个额外的判断来绕过IsAuthenticated
检查。
例如:使用request url
来确定是否执行此检查:
protected override async Task OnParametersSetAsync()
{
string currentUrl = NavigationManager.Uri;
if (!currentUrl.Contains("ForgotPass")){
navBarLeftInjectableMenu.SetContent(null, false);
if ((!(await AuthenticationState).User.Identity.IsAuthenticated))
{
NavigationManager.NavigateTo("/Login");
}
}
}