web-dev-qa-db-ja.com

ASP.NET IDチェックのユーザーロールが機能しない

ASP.NET MVC 5アプリケーションがあります。ユーザーとロールの管理に標準のASP.NET Identityプロバイダーを使用しています。独自のリポジトリプロジェクトからIdentityUserを使用していることが重要ですが、これは問題ないようです。ユーザーの登録、ログイン、編集、役割の管理を行うことができます。

次の行でロールにユーザーを追加します。

UserManager.AddToRole(userdetail.Id, r);
db.Entry(userdetail).State = EntityState.Modified;
db.SaveChanges();

これはDBレベルで機能しているようです。

しかし、私はロールベースの認証を使用することはできません、実際には単純な

HttpContext.User.IsInRole("Administrator")

あまりにも機能していません。

[Authorize(Roles="Administrator")]

あまりにも機能していません。

ユーザーが管理者かどうかは、この方法でのみ確認できます。

UserManager.IsInRole(userID, "Administrator").

どうして?

私が見つけたすべてのチュートリアルで、すべてがうまくいきます。別のプロジェクトリポジトリが原因である可能性がありますか?または、ASP.NETのIDがあまりにも壊れているのですか

アドバイスを下さい、

21
martonx

問題があるようです。[設計上の問題]

  • AuthorizeAttributeおよびUser.IsInRoleでは、ロール名は大文字と小文字が区別されます
  • ロール名はUserManager.IsInRoleでは大文字と小文字を区別しません

また、正しいロール名が確認に使用されていることを確認してください。

[上記は、以下のコードで実行されたテストに基づいています。 Role Name = "Admin"、ユーザーはRole "Admin"に追加されます。]

_[Authorize(Roles="Admin")] /*True as "Admin" has A capital as entered in Role name*/
public ActionResult Secured()
{
    if (User.IsInRole("admin")) /*This is False*/
    {
         Console.WriteLine("In");
    }
    if(UserManager.IsInRole(User.Identity.GetUserId(), "admin")) /*This is True!!*/
    {
         Console.WriteLine("In");
    }
    return View();
}
_

属性を[Authorize(Roles="admin")]に変更すると、ログインページにリダイレクトされます。

19
jd4u

その場合、ユーザーをログアウトして再度ログインする必要があります。

ロールのデータもCookieに格納されるため、Cookieを再発行して機能させる必要があります。

25
Maulik Anand

Web.configにこのエントリがありますか?

    <roleManager enabled="true">
        <providers>
            <clear />
            <add connectionStringName="ApplicationServices" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" applicationName="/" />
        </providers>
    </roleManager>

また、私が正しく覚えている場合、.NETの異なるバージョンでは、ロールプロバイダーアセンブリに異なる名前空間があります。

1
Fred Chateau