私は、個人認証を使用するIDを使用した単純なBlazorサーバーアプリケーションがあります。私はVS 2019標準からアプリを作成しましたdotnet new
テンプレート。
アプリの一部で、returnUrl
パラメーターを渡しながら、ユーザーをログインページに誘導したいと思います。このパラメーターを渡すために、次のコードのバリエーションを試しました(counterは戻りたいページです):
NavigationManager.NavigateTo("Identity/Account/Login?returnUrl=counter", forceLoad: true);
NavigationManager.NavigateTo("Identity/Account/Login?returnUrl='/counter'", forceLoad: true);
NavigationManager.NavigateTo("Identity/Account/Login?returnUrl='./counter'", forceLoad: true);
NavigationManager.NavigateTo("Identity/Account/Login?returnUrl='~/counter'", forceLoad: true);
ただし、これらすべての場合、「URIはローカルではありません」というエラーメッセージが表示されます。エラーメッセージは次のとおりです。
"InvalidOperationException:指定されたURLはローカルではありません。絶対パスを持つURLは、ホスト/権限部分がない場合、ローカルと見なされます。仮想パス( '〜/')を使用するURLもローカルです。"
この状況でreturnUrlパラメータの適切なフォーマットを提案できますか?さらに詳しい背景については、Blazorアプリのログインページへのリダイレクトについて、@ iambacon(Colinに感謝します)の提案 ブログ投稿 を参照しています。これはすばらしい記事であり、ユーザーが認証されていないときにログインにリダイレクトするという、私が望むことの一部を実現します。認証が完了した後、そのURLに戻るという追加機能を追加したいと思います。
「URIはローカルではありません」。
これを解決するには...
以下をせよ:
@inject NavigationManager NavigationManager
@code{
[Parameter]
public string ReturnUrl {get; set;}
protected override void OnInitialized()
{
ReturnUrl = "~/" + ReturnUrl;
NavigationManager.NavigateTo($"Identity/Account/Login?returnUrl=
{ReturnUrl}", forceLoad:true);
}
}
App.razorを開き、次のコードをAuthorizeRouteView.NotAuthorizedに追加します。
<NotAuthorized>
@{
var returnUrl =
NavigationManager.ToBaseRelativePath(NavigationManager.Uri);
<RedirectToLogin ReturnUrl="@returnUrl"/>
}
</NotAuthorized>
また、次のように、Appコンポーネントの上部にNavigationManagerを挿入します。
@inject NavigationManager NavigationManager
これをテストするには、Fetchdata(または、必要に応じてCounter)コンポーネントページの上部に、次のようにAuthorize属性の@attributeディレクティブを追加します。@attribute [Authorize]
認証されていないユーザーがFetchdataページにアクセスしようとすると、AuthorizeRouteView.NotAuthorizedデリゲートプロパティが実行され、RedirectToLoginコンポーネントのパラメーター属性が現在のURLに設定されてレンダリングされます。
更新
次の追加は、アプリにログインおよびログアウトボタンを追加することです...
<AuthorizeView>
<Authorized>
<a href="Identity/Account/Manage">Hello,
@context.User.Identity.Name!</a>
<form method="post" action="Identity/Account/LogOut">
<button type="submit" class="nav-link btn btn-link">Log
out</button>
</form>
</Authorized>
<NotAuthorized>
<a href="Identity/Account/Register">Register</a>
<a href="Identity/Account/Login">Log in</a>
</NotAuthorized>
</AuthorizeView>
MainLayoutコンポーネントで、次のようにLoginDisplay要素を追加します。
<div class="top-row px-4 auth">
<LoginDisplay />
<a href="https://docs.Microsoft.com/aspnet/"
target="_blank">About</a>
</div>
アプリを実行し、ログインおよびログアウトボタンをテストします...