私の問題に対して私が見つけた解決策は、この単純なIFilterAttributeで解決されました。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple=true)]
public class RedirectOnClaimFilter : ActionFilterAttribute, IActionFilter
{
public string ClaimType { get; set; }
public string ClaimValue { get; set; }
public string Controller { get; set; }
public string Action { get; set; }
#region IActionFilter Members
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
ClaimsIdentity id = (ClaimsIdentity)filterContext.HttpContext.User.Identity;
if (id.HasClaim(p => p.Type == ClaimType && string.Compare(p.Value, ClaimValue, true) == 0))
filterContext.Result = RedirectToAction(Controller, Action);
base.OnResultExecuting(filterContext);
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
//throw new NotImplementedException();
}
public void OnActionExecuting(ActionExecutingContext filterContext)
{
ClaimsIdentity id = (ClaimsIdentity)filterContext.HttpContext.User.Identity;
if (id.HasClaim(p => p.Type == ClaimType && string.Compare(p.Value, ClaimValue, true) == 0))
filterContext.Result = RedirectToAction(Controller, Action);
}
private ActionResult RedirectToAction(string Controller, string Action)
{
return new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary()
{
{"Controller", Controller},
{ "Action", Action}
});
}
#endregion
}
次に、次のようにコントローラー呼び出しで検証する特定のクレームを選択できます。
[RedirectOnClaimFilter(Action="WaitForApproval",
Controller="Account",
ClaimType = "http://solution/claims/pendinguser",
ClaimValue="true")]
[RedirectOnClaimFilter(Action = "RegisterFederated",
Controller = "Account",
ClaimType = "http://solution/claims/newuser",
ClaimValue = "true")]
[HandleError(ExceptionType = typeof(SecurityException), View = "Error")]
public class OrganizationController : BaseController
{
public ActionResult OrganizationAction()
{
return View();
}
}
プリンシパルのクレームセットで特定のクレームをチェックし、見つかった場合、ユーザーは特定のコントローラーとアクションにリダイレクトされます。