次のActionFilterAttributeを実装し、認証と役割の両方を処理するように機能します。私はこのように私自身のDBテーブルの役割を格納しています:
のUserRoleは
public class CheckRoleAttribute : ActionFilterAttribute
{
public string[] AllowedRoles { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
string userName = filterContext.HttpContext.User.Identity.Name;
if (filterContext.HttpContext.User.Identity.IsAuthenticated)
{
if (AllowedRoles.Count() > 0)
{
IUserRepository userRepository = new UserRepository();
User user = userRepository.GetUser(userName);
bool userAuthorized = false;
foreach (Role userRole in user.Roles)
{
userAuthorized = false;
foreach (string allowedRole in AllowedRoles)
{
if (userRole.Name == allowedRole)
{
userAuthorized = true;
break;
}
}
}
if (userAuthorized == false)
{
filterContext.HttpContext.Response.Redirect("/Account/AccessViolation", true);
}
}
else
{
filterContext.HttpContext.Response.Redirect("/Account/AccessViolation", true);
}
}
else
{
filterContext.HttpContext.Response.Redirect(FormsAuthentication.LoginUrl + String.Format("?ReturnUrl={0}", filterContext.HttpContext.Request.Url.AbsolutePath), true);
}
}
は、私はこのように呼んで
役割(ユーザーIDとRoleID外部キーが含まれています)
興味深い...しかし...私はあなたの上で自分の論理を置き換える必要があることを知っています。しかし、あなたのコードは答えの一部です(a)。私は(c)を確認することもできます。しかし、私はどのようにコードが何を調べるべきかを知ることができなかった(b)。私はIdentity.Nameを持っています...しかし、この時点で、この属性はどのようにビューデータが分かっていますか?または、アクションメソッド内のデータ(私はまだ実行されていないと仮定していますが、属性は最初に処理されるため) –
AuthorizationContextパラメータには、コントローラ、HttpContext、ResultContext、RouteData、およびResultへの参照が含まれます。一般化するには、属性に属性を追加して、ユーザーの名前に使用するルートデータキーを指定できるようにする必要があります。 。あなたは2つのコンストラクタを必要とするかもしれません:データベースコンテキスト/レイヤインタフェースをとるものと、パラメータを取らず、デフォルトのデータベースコンテキスト/レイヤを作成するもの。 – tvanfosson