自分のdbにUserテーブルがあり、 "Type"フィールドがあります。サイト運営者、監査者、管理者の3種類のユーザーがいます。私は[Authorize(Role = "Publisher")]のようなフィルタを使って、ログオンしたユーザーをフィルタリングする方法を知りたいのですか?MVC3の自分のデータベースに基づいてRoleFilterを作成する方法
0
A
答えて
0
私が理解している[Authorize(Role = "")]属性は、ロールプロバイダを使用するときに使用されます。あなたは非常に簡単に自分自身を転がすことができます - thisリンクを参照してください。
一般的に、私はUserテーブル、Roleテーブル、UserInRoleテーブルを持っています。ロールテーブルには、「管理者」などの役割IDと説明だけがあります。 UserInRoleテーブルは、ユーザーIDをロールIDにリンクする結合テーブルです。
このようにして、ユーザーは複数のロールに所属することができ、1つのロールに限定されることはありません。
これは私のやり方であり、必ずしも正しい方法ではないことにご注意ください。ユーザーテーブルの「タイプ」フィールドを使用しても機能する場合は、カスタムロールプロバイダが実装されているだけで、これとは別の場所に実装されます。
EDIT:[Authorize]属性もメンバーシッププロバイダのみで動作し、ロールプロバイダを持つ必要はありません。私は構文が[Authorize(User = "User1、User2")]かそのようなものだと思う。
EDIT:エラーページにユーザーを取るために、彼は正しい役割ではないかを示す、あなたのAccountControllerであなたのログイン方法にいくつかのカスタム・ロジックを追加することができます:あなたのアドバイスのための
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
if (!User.IsInRole("MyRole"))
{
return Redirect("Error");
}
else
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
&& !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
}
else
{
ModelState.AddModelError("", "The email or password provided is incorrect.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
THX、私は」役割の問題を解決しました。しかし、私は認証後にログオンについての新しい簡単な問題に遭遇しました。ユーザーがログオンした後にユーザーがロールに属していない場合は、エラーページを表示します。カスタムAuthorizeAttributeを作成する必要がありますか? – vulgur
私の編集を参照してください...私はそれがあなたが望むことをすると思います。 – Jack
ああ、ログイン方法....なぜ私はそれについて前に考えなかったのですか?フック私 – vulgur