ASP.NET MVC模式:控制器未重定向到另一个页面

bihw5rsg  于 2022-11-19  发布在  .NET
关注(0)|答案(2)|浏览(229)

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

问题:

9fkzdhlc

9fkzdhlc1#

您在什么上下文中从客户端调用Account/Login端点?
我不确定这是不是真的,但我想Blazor会阻止自动重定向,以免丢失导航状态,因为Blazor导航不是以传统的方式处理的(整个网站基本上是一个页面)。
您可以简单地向Account/Login发出请求,从结果中获取Location头,然后使用注入的NavigationManager显式导航到该URI。然而,这就引出了一个问题,即后端API是否应该负责确定将用户发送到何处(在本例中是某个主页)。由于用户从未离开Blazor应用程序,类似于以下内容应该足够了:

@inject NavigationManager UriHelper
...
loginResult = await httpClient.PostAsJsonAsync("Account/Login", loginParameters);
if (loginResult.IsSuccessStatusCode) // API should return 200 OK on login success
    UriHelper.NavigateTo("home");
else
  // Do something else
tjvv9vkg

tjvv9vkg2#

我回到使用Radzen登录组件,因为我想切换到MudBlazor,但它似乎调用了本地控制器上的PostAsJsonAsync不重定向到主页或任何页面。
通过在返回post结果后在前端使用NavigationManager进行重定向,无法解决该问题,它无法以某种方式获取用户的签名状态。
因此,回到我原来的代码,这工作,但会更喜欢如果任何人有另一个解决方案代替。
登入:

<RadzenContent Container="main">
  <ChildContent>
    <RadzenHeading Size="H1" Text="Login">
    </RadzenHeading>
    <div class="row">
      <div class="col-md-12">
        <RadzenTemplateForm Action="account/login" Data="@("login")" Method="post">
          <ChildContent>
            <RadzenLogin Register="@LoginRegister" ResetPassword="@LoginResetPassword">
            </RadzenLogin>
          </ChildContent>
        </RadzenTemplateForm>
      </div>
    </div>
  </ChildContent>
</RadzenContent>

控制器:

public async Task<IActionResult> Login(string userName, string password, string redirectUrl)
{
    if (env.EnvironmentName == "Development" && userName == "admin" && password == "admin")
    {
        var claims = new List<Claim>()
        {
            new Claim(ClaimTypes.Name, "admin"),
            new Claim(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 }, isPersistent: false, claims);

        return Redirect($"~/{redirectUrl}");
    }
    
    //...
}

相关问题