我有一个Blazor服务器,它有一个本地控制器用于同一个项目的身份验证。我想通过这个控制器登录用户,然后重定向到主页或上一页。
但是本地控制器上的Redirect("~/")
功能似乎不起作用,我尝试了不同的url包括外部url但没有成功,我尝试了很多次但都没有能够解决,任何帮助都将不胜感激。
登录提交:
result = await httpClient.PostAsJsonAsync("Account/Login", loginParameters);
控制器:
public class AccountController : Controller
{
[HttpPost]
public async Task<IActionResult> Login([FromBody]LoginParameters loginParameters)
{
string userName = loginParameters.UserName;
string password = loginParameters.Password;
string redirectUrl = loginParameters.RedirectUrl;
if (env.EnvironmentName == "Development" && userName == "admin" && password == "admin")
{
var claims = new List<Claim>
{
new(ClaimTypes.Name, "admin"),
new(ClaimTypes.Email, "admin")
};
roleManager.Roles.ToList().ForEach(r => claims.Add(new Claim(ClaimTypes.Role, r.Name)));
await signInManager.SignInWithClaimsAsync(new ApplicationUser { UserName = userName, Email = userName }, false, claims);
//return Redirect("https://localhost:5001/");
//return Redirect("https://www.google.com/");
return Redirect($"~/{redirectUrl}");
}
// More stuff
}
}
Program.cs
:
builder.Services.AddHttpContextAccessor();
builder.Services.AddScoped(serviceProvider =>
{
var uriHelper = serviceProvider.GetRequiredService<NavigationManager>();
return new HttpClient { BaseAddress = new Uri(uriHelper.BaseUri) };
});
builder.Services.AddHttpClient();
//...
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
app.Use((ctx, next) =>
{
ctx.Request.Scheme = "https";
return next();
});
}
else
app.UseDeveloperExceptionPage();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute("default","{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllers();
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
});
app.Run();
问题:
2条答案
按热度按时间9fkzdhlc1#
您在什么上下文中从客户端调用
Account/Login
端点?我不确定这是不是真的,但我想Blazor会阻止自动重定向,以免丢失导航状态,因为Blazor导航不是以传统的方式处理的(整个网站基本上是一个页面)。
您可以简单地向
Account/Login
发出请求,从结果中获取Location
头,然后使用注入的NavigationManager
显式导航到该URI。然而,这就引出了一个问题,即后端API是否应该负责确定将用户发送到何处(在本例中是某个主页)。由于用户从未离开Blazor应用程序,类似于以下内容应该足够了:tjvv9vkg2#
我回到使用
Radzen
登录组件,因为我想切换到MudBlazor
,但它似乎调用了本地控制器上的PostAsJsonAsync
不重定向到主页或任何页面。通过在返回post结果后在前端使用
NavigationManager
进行重定向,无法解决该问题,它无法以某种方式获取用户的签名状态。因此,回到我原来的代码,这工作,但会更喜欢如果任何人有另一个解决方案代替。
登入:
控制器: