ロールマネージャ機能が有効になっていません


192

次のProviderExceptionを取得しました

ロールマネージャ機能が有効になっていません。

ここまでは順調ですね。

Role Managerが有効になっているかどうかを確認するために呼び出すことができるメソッドはどこにありますか?

回答:


302

これを行うには、次の場所にあるブール型プロパティを読み取ります。

System.Web.Security.Roles.Enabled

これは、enabledroleManager要素の属性から直接読み取られますweb.config

<configuration>
  <system.web>
    <roleManager enabled="true" />
  </system.web>
</configuration>


更新:
詳細については、このMSDNサンプルを確認してくださいhttps : //msdn.microsoft.com/en-us/library/aa354509(v=vs.110).aspx


1
代わりにコードからこれを行うにはどうすればよいweb.configですか?私はそれを入れてみました、Application_Startそしてそれは言いますThis method can only be called during the application's pre-start initialization phase.
Maslow

1
これはweb.configのどこにありますか?
マットコノリー2013年

17
上記をweb.configに追加するroleManager と、有効になります。しかし、今は例外が発生していますUnable to connect to SQL Server database
Irfan Yusanif

2
@Infotekka "SQL Serverデータベースに接続できません"エラー。
ジャック

2
うわー、これは素晴らしい答えです、私は何も設定する必要はなく、ただ魅力のように機能します。web.configで構成したら、User.Identity.IsAuthenticatedをチェックして、ログインユーザーが認証されているかどうかを確認できます。とてもクールなasp.net
Quan

52

新しいを使用しているためにここに来た場合ASP.NET Identity UserManager、実際に探しているのはRoleManager

var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));

roleManager は、ロールが存在するかどうかを確認するためのアクセス権を作成し、作成などします。さらに、ロールは UserManager


73
3歳児は何と関係がありますか?Identityの設定に関する問題を扱っていたため、Googleからこの投稿に移動しました。私がそれを理解したので... Googleによってここに連れて来られた私と同じ問題を扱う次の人は何をすべきかを知っています...
Serj Sagan 2014

1
また、Identity UserManagerには、指定されたユーザーのロールを取得するための便利な機能があります。UserManager.GetRolesAsync(User.Identity.GetUserId());
keithl8041 2015年

var roleManager = new RoleManager <IdentityRole>(new RoleStore <IdentityRole>(new ApplicationDbContext()));はどこに配置しますか??
マリオM

あなたはアプリのどこでもそれを行うことができます。明らかにいくつかの参照を解決する必要がありますが、Identityアプリでロールが必要な場所ならどこでも、このステートメントを使用できます。
Serj Sagan

11

Googleを介して、a)db接続文字列(Rolesが使用しているもの)が正しいこと、およびそのキーのスペルが正しいことを確認し、b)RoleManagerのEnabledフラグがtrueに設定されていることを示唆する2つの提案を見つけました。それらの1つがお役に立てば幸いです。それは私のためにした。

Roles.Enabledを確認してみましたか?また、Roles.Providersを確認して利用可能なプロバイダーの数を確認したり、デフォルトプロバイダーのRoles.Providerを確認したりできます。nullの場合はありません。


答えてくれてありがとう。しかし、それは私が望むものではありません。RoleException機能が有効かどうかを確認するメソッドが必要です。そのためにProviderExceptionをキャッシュしません。
gsharp

8

言及されている例外のため、この質問を見つけました。Web.Configに<roleManager>タグがありませんでした。追加した場合でも(Infotekkaが示唆したように)、データベース例外が発生することに気付きました。ここにある他の回答の提案に従っても、問題を完全に解決したものはありません。

これらのWeb.Configタグは自動的に生成できるため、手動で追加して解決するのは間違っていました。同様の場合は、Web.ConfigとVisual Studioに加えたすべての変更を元に戻します。

  1. Ctrl+を押しQnugetと入力して、「NuGetパッケージの管理」をクリックします。
  2. Ctrl+を押してプロバイダーE入力すると、リストに「Microsoft ASP.NET Universal Providers Core Libraries」と「Microsoft ASP.NET Universal Providers for LocalDB」(どちらもMicrosoftが作成)が表示されます。
  3. 両方の[インストール]ボタンをクリックして、NuGetウィンドウを閉じます。
  4. Web.configを確認すると、次のように、少なくとも1つの<providers>タグがProfileMembershipSessionStateタグ内にあり、新しいRoleManagerタグ内にもあるはずです。

    <roleManager defaultProvider="DefaultRoleProvider">
        <providers>
           <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=NUMBER" connectionStringName="DefaultConnection" applicationName="/" />
        </providers>
    </roleManager>
  5. 次のenabled="true"ように追加します。

    <roleManager defaultProvider="DefaultRoleProvider" enabled="true">
  6. F6ビルドを押して、データベースの更新に例外なく進むことができます。

    1. Ctrl+を押してQmanagerと入力し、「Package Manager Console」をクリックします。
    2. Type update-database -verboseとSeedメソッドは問題なく実行され(他の場所で混乱していない場合)、データベースにいくつかのテーブルを作成します。
    3. プレスCtrl+ W+ Lサーバーエクスプローラを開くために、あなたがしてチェックすることができるはずなデータコネクション> DefaultConnectionを>テーブルの役割UsersInRolesの新しく作成されたテーブル間のテーブル!

1
Web.Configフィールドが自動的に生成されるため」これは完全に正しいわけではありません。多くのNuGetパッケージは構成ファイルを自動的に調整しますが、調整を要求する規則はありません。
Kevin R.

これは完璧です。Thnx
sapatelbaps

6

使用しているASP.NET Identity UserManager場合は、次のように取得することもできます。

var userManager = Request.GetOwinContext().GetUserManager<ApplicationUserManager>();

var roles = userManager.GetRoles(User.Identity.GetUserId());

たとえば、ユーザーのキーをGuidからIntに変更した場合は、次のコードを使用します。

var roles = userManager.GetRoles(User.Identity.GetUserId<int>());

これでうまくいきました。投票する場合は、その理由をお聞かせください。
オグラス2017

useridをintにキャストする必要があるため、これは機能しません。
おもちゃ

@toyいいえ、<int>は値をintとして取得します。変換する必要はありません。もちろん、これが機能するためには、IDキーがintである必要があります。
オグラス2017

-1
<roleManager
  enabled="true"
  cacheRolesInCookie="false"
  cookieName=".ASPXROLES"
  cookieTimeout="30"
  cookiePath="/"
  cookieRequireSSL="false"
  cookieSlidingExpiration="true"
  cookieProtection="All"
  defaultProvider="AspNetSqlRoleProvider"
  createPersistentCookie="false"
  maxCachedResults="25">
  <providers>
    <clear />
    <add
       connectionStringName="MembershipConnection"
       applicationName="Mvc3"
       name="AspNetSqlRoleProvider"
       type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    <add
       applicationName="Mvc3"
       name="AspNetWindowsTokenRoleProvider"
       type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </providers>
</roleManager>

-1

ユーザーの役割のリストを取得するために、MVC5以降のアカウントコントローラーに配置する必要があるコードは次のとおりです。

csharp public async Task<ActionResult> RoleAdd(string UserID) { return View(await UserManager.GetRolesAsync(UserID)).OrderBy(s => s).ToList()); }

Roles.GetRolesForUser()Role Manager機能を使用して有効にする必要はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.