点击Blazor网页组装应用程序中的忘记密码后,再次返回登录页面



我有一个"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");
}
}
}

最新更新