9

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

これは非常にうまく機能します(ログインしていない場合はログインに戻されます)が、この属性にいくつかの役割を追加したいのですが、次のようなことができることを読みました[Authorize(Roles = "Customer"]が、これを行うとすぐに送信されますアプリケーションのログイン ページに戻りますか?

このRolesオーバーライドは、新しい 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");
}

データベースによると、ユーザーはこの役割に属しています。なぜこれが機能しないのですか?構成または何らかの種類がありませんか?

4

5 に答える 5

9

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

これが機能しなかった理由(何時間も掘り下げた)は、私のコンテキストに次のものがあったためです。

Configuration.ProxyCreationEnabled = false;

これにより、遅延読み込みが無効になり、ユーザーが読み込まれたときにロールが含まれなくなりました!

したがって、修正はこれを有効にするか、行を削除することでした。

更新: 2015-05-01

これはバグで、2.0.0-alpha1 リリースで修正されました。したがって、この回避策は今後必要なくなり、ロールはこの設定に関係なくロードされます。

Identity Owin には LazyLoading が必要ですか?

于 2014-01-10T16:35:28.837 に答える
0

私の場合、AspNet Identity で問題なく動作します。よろしいですか:

  • 承認フィルターをカスタマイズしていないか、正しく行っていませんか?
  • web.config で認証/承認を再構成していませんか?
  • AspNet ID テーブルに適切なエントリがあります: AspNetUsers、AspNetRoles、AspNetUserRoles (ロールが存在し、ユーザーが持っています)?
于 2014-01-08T20:14:07.010 に答える
0

次のようにロールを作成します。

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");

これがうまくいくかどうか教えてください。

于 2014-01-08T17:48:24.247 に答える
0

私はそれをテストするためにサンプルを書きます、それはうまくいきます.だから私はそこに2つのポイントがあると思います.1.あなた のクッキーは
ブラウザに保存されません.

Cookie を確認してください。「.AspNet.ApplicationCookie」(デフォルト名) という名前の Cookie があるかどうかを確認してください。そうでない場合は 、ブラウザで
Cookie の書き込みを許可するか、Cookie を書き込むコードを確認してください。

ISecureDataFormat<AuthenticationTicket>  

と構成

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<Claim>) でデータを確認できるシリアル化に関するいくつかのことは
、ロール情報を含む Claim を持っている必要があります

于 2014-01-09T09:25:53.680 に答える
0

この回答を確認してください: ASP.NET Identity check user roles is not working

あなたの場合、ケースを確認しながら、IdentityRole レコードと Authorize Attribute のケースを比較します。と比較しないでください。UserManager.AddToRole(user.Id, "Customer");

于 2014-01-09T06:11:23.767 に答える