使用 AuthorizeRouteView 重定向时如何获取原始目的地

How to get original destination when redirecting using AuthorizeRouteView

我正在尝试获取用户在被重定向登录后导航到的原始目的地。

在我的 App.razor 中,我有一个控件,当用户访问受保护的内容但未登录时使用

<CascadingAuthenticationState>
<Router AppAssembly="@typeof(Program).Assembly">
    <Found Context="routeData">
        <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
            <NotAuthorized>
                <RedirectToLogin RouteData="@routeData" />
            </NotAuthorized>
            <Authorizing>
                <p>Checking that you have a valid access token.</p>
            </Authorizing>
            </AuthorizeRouteView>
    </Found>
    <NotFound>
        <LayoutView Layout="@typeof(MainLayout)">
            <p>Sorry, there's nothing at this address.</p>
        </LayoutView>
    </NotFound>
</Router>

这会将用户重定向到备用控件,然后显示登录页面

   public class RedirectToLogin : ComponentBase
{
    [Parameter]
    public Microsoft.AspNetCore.Components.RouteData RouteData { get; set; }

    [Inject]
    protected NavigationManager NavigationManager { get; set; }

    protected override void OnInitialized()
    {
         string url = QueryHelpers.AddQueryString("/account/login", "redirect_url", "originalDestination");
        NavigationManager.NavigateTo(url);
    }
}

但我想不通的是如何在用户登录后将其重定向到原始页面。我可以在 RouteData 中看到类型,但没有路径或路由值。

编辑:

我现在找到了获取路径的方法,但它似乎不是最好的方法。 这是唯一的方法还是我做错了什么?

 var attr = RouteData.PageType.GetCustomAttributes(true);
        var route = attr.FirstOrDefault(x => x.GetType() == typeof(RouteAttribute));
        if (route != null)
        {
            _string redirectUri = (route as RouteAttribute).Template;
        }

您所做的是一种古怪的解决方法,并且存在问题。但是,如果了解 Blazor 路由的操作方式,这很容易做到。但是,提取的方式是returnurl;那就是当前位置(请注意,当前位置没有改变,正如您可能认为的那样,因为 App 组件不是路由的一部分),就是在 App 组件中使用导航管理器。以下代码片段完成了这项工作。将它们添加到您的组件中。

Login.razor

@page "/login/{returnurl}"


@code {
    // A parameter to get and store the return url
    [Parameter]
    public string ReturnUrl { get; set; }

}

App.razor

@inject NavigationManager NavigationManager



<NotAuthorized>
 @{
     var returnUrl = NavigationManager.ToBaseRelativePath(NavigationManager.Uri);

      <Login ReturnUrl="@returnUrl" />
  }

 </NotAuthorized>

我认为不需要任何进一步的解释,但如果您有任何疑问,请随时提问。