ASP.NET Core MVCとBlazor WebAssemblyにて、セッションの共有は可能でしょうか?

大山 0 評価のポイント
2024-02-21T02:23:10.7733333+00:00

お世話になっております。
「ASP.NET Core MVC(以下、MVC)」と「Blazor WebAssembly(以下、WASM)」を使用した開発で、いくつか問題が発生いたしました。
以下に、これまでの経緯と現在の状態、問題点を記載いたしますので、ご確認いただき、解決策がありましたらご教示ください。   【これまでの経緯】
・「MVC」のプロジェクトのみ
・下記のリンク先に記載されている方法を使用して、RazorコンポーネントをMVCのページに表示し、
 「Blazor Server」を使用しておりました。
https://learn.microsoft.com/ja-jp/aspnet/core/blazor/components/prerendering-and-integration?view=aspnetcore-7.0&pivots=server
・ローカル環境では想定通り動作しておりましたが、
 本番環境にて「WebSocket」が使用できないため、想定していた動作ができておらず、
 下記のリンク先でお問い合わせさせていただき、「WASM」を使用するように変更しております。
https://learn.microsoft.com/ja-jp/answers/questions/1535626/blazor-longpolling   【現在の状態】
・「MVC」と「WASM」をプロジェクトを分けて作成している。
・各プロジェクトで共通する処理は、「Common」という名称のプロジェクトに作成し、
 「Common」を「MVC」と「WASM」が参照している。
・「MVC」でログインやメニュー画面等の作成、「WASM」で一部のページを作成している。
・ローカルで実行すると、「WASM」を使用しているページでエラーが発生する。   【問題点】
・「WASM」で作成しているページで、セッションからユーザー名等の情報を取得しようとするが、画像のようなエラーが発生する。
 →「WASM」ではセッションを使用することが可能か?
  →セッションを使用することが可能な場合、
   「MVC」と「WASM」で同じセッション情報を取得することは可能か?
  →セッションを使用することが不可能な場合、
   実現可能な代替手段はどのようなものがあるか?   以上となります。
よろしくお願いいたします。
User's image

ASP.NET
ASP.NET
Web アプリケーションと XML Web サービスを構築するための Microsoft .NET Framework のテクノロジのセット。
7 件の質問
0 件のコメント コメントはありません
{count} 件の投票

1 件の回答

並べ替え方法: 最も役に立つ
  1. Raina Zhao - MSFT 2,855 評価のポイント Microsoft ベンダー
    2024-02-22T10:29:44.4066667+00:00

    大山さん、こんにちは。フォーラムオペレーターのRainaです。
    Microsoft Q&A フォーラムにご投稿くださいましてありがとうございます。

    セッションはサーバ側に存在し、ASP.NET Core により、セッション ID を含む cookie がクライアントに提供されて、セッションの状態が維持されます。
    https://learn.microsoft.com/ja-jp/aspnet/core/fundamentals/app-state?view=aspnetcore-8.0#session-state

    Webassemblyバンドルがダウンロードされ、ブラウザで実行されます。そのため、セッションに直接アクセスできません。

    また、ログインすると、ユーザー情報はセッションに保存されません。たとえば、Cookie認証でmvcアプリを保護する場合、クレームはCookieに保存され、リクエストを送信するたびに、UserClaimsは認証ミドルウェアによってCookieから読み取られます。

    あなたの状況では、ユーザー情報を公開するAPIエンドポイントを作成し、httpclientを使用してWebAssemblyからエンドポイントにリクエストを送信して値を取得することができます。 httpclient のハンドラーを作成する
    public class CookieHandler : DelegatingHandler
        {
            protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
            {
                request.SetBrowserRequestCredentials(BrowserRequestCredentials.Include);               return await base.SendAsync(request, cancellationToken);
            }
        }   Register the handler/httpclient
    builder.Services
        .AddTransient<CookieHandler>()
        .AddScoped(sp => sp
            .GetRequiredService<IHttpClientFactory>()
            .CreateClient("API"))
        .AddHttpClient("API", client => client.BaseAddress = new Uri(apiAddress)).AddHttpMessageHandler<CookieHandler>();

    サーバー側で’corsポリシーを構成する時に、AllowCredentialsを設定する
    app.UseCors(
         x => x.AllowCredentials()
         .......
                    );

    どうぞよろしくお願いします。


    参考になった投稿には「回答を承認する」と投票をご設定ください。さらに質問がある場合は、「コメント」を追加してください。 注意:Q&Aからメール通知を受け取りたい場合には、ドキュメントの手順に基づいて、メール通知を有効にしてください。 Regards, Raina

    0 件のコメント コメントはありません

お客様の回答

回答は、質問作成者が [承諾された回答] としてマークできます。これは、ユーザーが回答が作成者の問題を解決したことを知るのに役立ちます。