質問

[Authorize]属性によって保護されているコントローラを持っています。

これは非常に良いです(ログインしていない場合はログインに戻ります)、この属性にいくつかの役割を追加したいと思います。私は即座に私のアプリケーションでログインページに返送されますか?

この[Authorize(Roles = "Customer"]オーバーライドは新しいASP.NET IDで動作しないのですか?私のユーザー作成では、次のコードでユーザーを追加しています。

var user = new ApplicationUser {UserName = model.Username};
var result = UserManager.Create(user, model.Password);
if (result.Succeeded)
{
    UserManager.AddToRole(user.Id, "Customer");
    SignIn(user, false);

    return RedirectToAction("Done");
}
.

およびデータベースに従って、ユーザーはこの役割にあります。これはうまくいかないのですか?構成やいくつかの種類がありませんか?

役に立ちましたか?

解決

私は自分の質問に答えるつもりです。

これが機能していなかった理由(周りの掘りづくり時間)私の文脈が次のものを持っていたためです。

Configuration.ProxyCreationEnabled = false;
.

これは、Lazyloadingが無効にされた、したがって、ユーザーがロードされたときに役割は含まれていません!

だから修正はこれを有効にするか、行を取り除くことでした。

アップデート:2015-05-01

これは、2.0.0-alpha1リリースで修正されたバグでした。したがって、この回避策はもう前に必要ではなく、この設定にかかわらずロールがロードされます。

は、Lazyloadingを必要としますか?

他のヒント

そのような役割を作成する:

RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new MyDbContext()));
var roleresult = RoleManager.Create(new IdentityRole(roleName));
.

その後、そのようなユーザーを追加します。

var currentUser = UserManager.FindByName(user.UserName); 
var roleresult = UserManager.AddToRole(currentUser.Id, "Superusers");
.

これがあなたのために働くかどうか私に知らせてください。

私の場合はASPNETアイデンティティでうまく機能します。あなたはあなたに:

を確信していますか

  • カスタマイズされた承認フィルタを持っていない、またはそれを正しく行っていませんか?
  • web.configで認証/承認を再設定していませんか?
  • ASPNet IDテーブルに適切なエントリがあります。aspnetusers、aspnetroles、aspnetuserRoles(ロールが存在し、ユーザーが存在します)?

チェックアウトこの回答: ASP.NET IDチェックユーザーロールが機能していません

あなたの場合は、事件を確認しながら、IdentityRoleレコードとauthorize属性の場合を比較してください。UserManager.AddToRole(user.Id, "Customer");

と比較しないでください。

私はそれをテストするためにサンプルを書いて、それはうまく機能します。私は2点があると思います
1.あなたはブラウザに保存されない
2.ロール情報

を使っていないクッキー

Cookieのチェック、 ".aspnet.applicationCookie"というクッキーはあります(デフォルト名)
もしそうでなければ、あなたのroswerをチェックすることを確認するか、あなたがクッキーを書くコード、またはあなたがクッキーを書くコード exsitの場合は、クラス拡張

を作成できます。
ISecureDataFormat<AuthenticationTicket>  
.

とconfig

app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            TicketDataFormat=new T()

        });
.

new t()はクラス
このクラスでは

が必要です
public string Protect(AuthenticationTicket data)
.

public AuthenticationTicket Unprotect(string protectedText)
.

シリアル化についての一部です
ブレークポイントを設定してデータを確認できます。 Data.Identity.Claims(IEnumerable <クレーム>)はあなたの役割情報

との主張を持つべきです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top