2013-11-21 22 views
18

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

私はこれらの行を持つ役割にユーザーを追加します。

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アイデンティティはそれほど壊れていますか?

してくださいアドバイス、

+3

私は同じ問題があります。どんな解決策ですか? – janhartmann

+0

答えが掲載されました。受け入れ。 jd4uによるもの。 – DtechNet

答えて

13

問題があるようです。【設計によって問題]

  • ロール名はAuthorizeAttributeとUser.IsInRole
  • で大文字と小文字が区別されているロール名は

またUserManager.IsInRoleで大文字と小文字を区別しない、を確認正しいロール名が検証に使用されます。

[上記は、以下のコードで行われたテストに基づいています。役割名=「管理者」、ユーザーが役割「管理者」に追加されます。]

[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")]に属性を変更する場合は、ログインページにリダイレクトします。

+0

あなたはこの問題を回避する方法を知っていますが、まったく同じ問題があります。私はカスタムユーザーとロールストアを使用していますが、推測する必要がありますが、マネージャとユーザーと注釈ではなく正常に動作します。 – Baserz

+0

これは私の人生を救った私はこの答えが受け入れられなかった理由を知らない。他に何も言及していない。 Googleで「Identity userinrole」を検索すると、不正確な「User.IsInRole」< - が表示されません。確かに彼らは古い質問で、ASP.NET MVC 5は2歳ですが、まあまあです。誰かが元のMVC 5スタックをプログラミングしていれば、それはそれです!おそらく.NET COREでも動作します。 – DtechNet

+0

これの大文字と小文字の区別は犯罪に過ぎません。バグでなければなりません。私は自分のコードでこれを見つけて、時間の素敵な塊を無駄にした後でこの答えを見つけました。あなたの答えを喚起する! –

0

あなたのweb.configファイルでこのエントリを持っていますか?

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

また、正しく覚えていれば、さまざまなバージョンの.NETで役割プロバイダアセンブリの異なる名前空間があります。

+9

ASP.NET IDを持つ最新のASP.NET MVC 5についてお話ししていますか? – martonx

22

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

ロールデータもクッキーに格納されているため、 クッキーを再度発行して作業する必要があります。

+2

また、セキュリティスタンプを更新して、ユーザーを再度ログオンしてログアウトする必要なく、同じことを達成できます。 http://stackoverflow.com/a/19505060/110871 – Funka

+1

クールな回答を見る... –

関連する問題