質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

blazor

Blazorは、マイクロソフトが開発している.NETベースのWebアプリフレームワークです。C#でフロントエンドもバックエンドも一貫して書くことが可能。クライアントサイド(WebAssembly)とサーバーサイド形式のホスティングモデルがあります。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

5332閲覧

[ASP.NET Identity]ロール認証でユーザにロールを紐づけても認証されない

SparklingLemon

総合スコア10

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

blazor

Blazorは、マイクロソフトが開発している.NETベースのWebアプリフレームワークです。C#でフロントエンドもバックエンドも一貫して書くことが可能。クライアントサイド(WebAssembly)とサーバーサイド形式のホスティングモデルがあります。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2021/05/21 03:14

編集2021/05/21 04:37

前提

Blazor(サーバー)にて開発をしております。
こちらを参考に個別の認証テンプレートを用いて認証機能 ( [Authorize]属性 ) の実装を行うことが出来ました。

そこから発展してこちらを参考にしてロール承認の実装 ( [Authorize(Roles = "hoge")]属性 ) を行おうとしています。

発生している問題

ログインユーザに紐づくロール情報をDBに登録([AspNetUsers][AspNetUserRoles][AspNetRoles]それぞれのテーブルにレコード作成)して
ログイン後に [Authorize(Roles = "hoge")]属性を付与したページを表示すると認証されておらず、ページを表示出来ない状態です。

イメージ説明

該当のソースコード

razor

1 2@page "/counter" 3@attribute [Authorize(Roles = "admin")] 4@*↑テンプレートからの変更箇所*@ 5<h1>Counter</h1> 6 7<p>Current count: @currentCount</p> 8 9<button class="btn btn-primary" @onclick="IncrementCount">Click me</button> 10 11@code { 12 private int currentCount = 0; 13 14 private void IncrementCount() 15 { 16 currentCount++; 17 } 18} 19

AspNetUsersテーブル(関係ありそうな列のみ抜粋)

IdUserNameNormalizedUserNameConcurrencyStamp
e113846d-a48e-44b6-8605-f9ff8d5080ffhoge@hoge.comHOGE@HOGE.COMd6b208b7-6ee3-4b8b-87ea-79cae204ca84

AspNetUserRolesテーブル

UserIdRoleId
e113846d-a48e-44b6-8605-f9ff8d5080ffadmin

AspNetRolesテーブル

IdNameNormalizedNameConcurrencyStamp
adminadminadmind6b208b7-6ee3-4b8b-87ea-79cae204ca84

試したこと

知識が乏しく原因の推察すら出来ていない状態です。
的外れなことを確認しているかとは思いますが、試したことは以下です。

①AspNetRolesテーブルのNormalizedNameを'admin'⇒'ADMIN'に変更
②AuthenticationStateProvider.GetAuthenticationStateAsync()を呼び出しAuthenticationStateを確認
⇒roleプロパティがあってそこがNullになってしまっているのかなと予想していたのですが、ロールに関係しそうなプロパティは無く、色々登録されているプロパティの中身を確認しても原因となっているものは見つけることが出来ませんでした。


追記

下記で調べてみたところFalseが返ってきており、ユーザとロールが紐づいていないようです。
紐づけを行う処理が別途必要なのでしょうか?
また、どのように行えばいいのでしょうか?

C#

1var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync(); 2var user = authState.User; 3 4Console.WriteLine(user.IsInRole("admin"));

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ロールサービスの追加がされていないのではとか、DB のテーブルに直接データを書き込んでもダメなのでは(ロールの追加、ユーザーへのロールのアサインなどそれ用に ASP.NET に用意されたメソッドを使わないとダメなのでは)などが疑わしいのですが、そのあたりはいかがですか?

ASP.NET Core MVC の場合は以下のようにしたのですが、同じ ASP.NET Core Identity を使う Blazor でも同じようにする必要があるのではないでしょうか?

ASP.NET Identity のロール管理 (CORE)
http://surferonwww.info/BlogEngine/post/2020/06/01/role-management-on-aspnet-core-mvc.aspx

Blazor Server で試したわけではないので、ハズレでしたらすみません。

投稿2021/05/21 05:18

編集2021/05/21 05:32
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SparklingLemon

2021/05/21 06:18

> ロールサービスの追加がされていないのでは 仰る通り、ローカルサービスの追加をしていなかったため、「.AddRoles<IdentityRole>()」を追記しました。 > DB のテーブルに直接データを書き込んでもダメなのでは そうなのですね。ASP.NET Identity自体の知識が乏しく何が必要なのかわかっていないため、 提示して頂いたページを読ませていただきます。
SparklingLemon

2021/05/21 09:48

下記修正により期待した動作を行うことが確認できました。 ありがとうございました。 ■IdentityHostingStartup.cs public class IdentityHostingStartup : IHostingStartup { public void Configure(IWebHostBuilder builder) { //builder.ConfigureServices((context, services) => { //}); builder.ConfigureServices((context, services) => { services.AddDbContext<IdentityDbContext>(options => options.UseSqlServer(context.Configuration.GetConnectionString("DefaultConnection")) ); services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddRoles<IdentityRole>() .AddEntityFrameworkStores<IdentityDbContext>(); }); } } ■Startup.cs public void ConfigureServices(IServiceCollection services) { //services.AddDbContext<ApplicationDbContext>(options => // options.UseSqlServer( // Configuration.GetConnectionString("DefaultConnection"))); //services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) // .AddEntityFrameworkStores<ApplicationDbContext>(); services.AddRazorPages(); services.AddServerSideBlazor(); services.AddScoped<AuthenticationStateProvider, RevalidatingIdentityAuthenticationStateProvider<IdentityUser>>(); services.AddDatabaseDeveloperPageExceptionFilter(); services.AddSingleton<WeatherForecastService>(); }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問