web-dev-qa-db-ja.com

ユーザーが認証されていない場合、Blazorはログインにリダイレクトします

私はBlazor Webアセンブリを使用してアプリを開発しようとしています、そして私はユーザーが認証されていない場合、私がアプリケーション全体を保護する方法について疑問に思います。実装する行動は次のとおりです。

  • 匿名ユーザーが任意のページを要求した場合、彼はログインページにリダイレクトされます

より良い

  • ユーザー必須このアプリの使用のために認証されています

現時点では、この現象をすべてのページに[Authorize]属性を適用していますが、集中化したいと思います。

この目標をBlazor Server Sideでは、[Authorize]コンポーネント内の_Host.razor属性を適用しました。

Blazorクライアント側でも解決策はありますか?

6
Leonardo Lurci

基本的にBlazorapp.Clientのすべてのページへの許可を適用するには、追加する必要があります。

@attribute [Microsoft.AspNetCore.Authorization.Authorize]
 _

...あなたの_imports.razorファイルに。

さらに、追加できます。

@attribute [Microsoft.AspNetCore.Authorization.AllowAnonymous]
 _

...権限を必要としないページについて。

また、ユーザーを任意のページにリダイレクトしたい場合は、ここに私が思い付いたものです。

<NotAuthorized>
    @if (true) { navMan.NavigateTo("login"); }
</NotAuthorized>
 _

... NAVMANがNavigationManagerの注入されたインスタンスです。ここでは、許可されたユーザーのみのページにアクセスしようとすると、ユーザーをlogin.razorにリダイレクトしています。

1
mend0k

私は@Brettから解決策を試してみましたが、それは働いたページに戻りましたが、ユーザーはAuthorizing...Checking login state...と言った後、ついにCompleting login...と言ってそこに立ち往生しました。その後、ユーザーはリンクをクリックするか、手動で前のURLを手動で入力して戻って戻る必要がありました。

enter image description here

enter image description here

enter image description here

Microsoftは "のドキュメントを持っています(== --- ==)アプリ全体の許可が必要です"。

https://docs.microsoft.com/en-us/aspnet/core/blazor/security/webassembly/?view=aspnetcore-5.0#require-authorization-for-the-entire-app

ドキュメントによると:

  • _Imports.razorファイルのauthorize属性指令を使用します。
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize]
  • Pagesフォルダ内の各Razorコンポーネントにauthorize属性を追加します。

コードを_Imports.razorに追加しましたが、コンテンツの白い画面しか受け取っただけです。

enter image description here

その後、https://localhost:44123/authentication/loginShared\RedirectToLogin.razorが正常に指しているホワイト画面を私に与えたことに気づいた。その後、@attribute [AllowAnonymous]Pages\Authentication.razorを追加し、それからすべてが期待どおりに機能し、立ち往生しませんでした。

enter image description here

この解決策では、デフォルトのYou are logged out.メッセージも表示できます。

enter image description here

0
Ogglas

_<NotAuthorizedContent>_コンポーネントとして_<Router>_テンプレートを活用することができます ここに記載されています

_<CascadingAuthenticationState>
    <Router AppAssembly="typeof(Startup).Assembly">
        <NotFoundContent>
            <p>Sorry, there's nothing at this address.</p>
        </NotFoundContent>
        <NotAuthorizedContent>
            <h1>Sorry</h1>
            <p>You're not authorized to reach this page. You may need to log in as a different user.</p>
        </NotAuthorizedContent>
        <AuthorizingContent>
            <p>Please wait...</p>
        </AuthorizingContent>
    </Router>
</CascadingAuthenticationState>
_

RedirectToLoginのようなOnInitializedAsyncのようなものと呼ばれる_<NotAuthorizedContent>_の内容を置き換え、ユーザーがログインしているかどうかをチェックし、そうでない場合はリダイレクトを行います。

0

私の旅行では、Blazorに精通しています。すべてがBlazorのコンポーネントのように思われるので、あなたのログインページも同様にコンポーネントです。それは少なくともチュートリアルでです。だから彼がすることはすべてこれだけです:

<NotAuthorized>
    <Login />
</NotAuthorized>
 _

そして、もちろんあなたのログインコンポーネントに正しいものを追加する必要があります。

このソリューションの下側は、URLがログインしていないときに表示されているページと一致しないことです。

0
Cornelis