ASP.NET IDを使用したAuthorizeAttribute
-
20-12-2019 - |
質問
[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;
.
だから修正はこれを有効にするか、行を取り除くことでした。
アップデート:2015-05-01
これは、2.0.0-alpha1リリースで修正されたバグでした。したがって、この回避策はもう前に必要ではなく、この設定にかかわらずロールがロードされます。
他のヒント
そのような役割を作成する:
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 <クレーム>)はあなたの役割情報