0

クレームベースのID、認証、および承認があります。

私のClaimsAuthenticationManagerで、ユーザーフェデレーショントークンクレームを変換し、アプリケーション固有のクレームをClaimsPrincipal.IdentityのClaimsIdentityに追加します。

フェデレーションユーザーがアプリケーションにローカルに登録されていない場合、 "http://xml/claims/newUser"値として「true」を使用してクレームを生成します。

ここで、私のアプリケーションでは、ユーザーが自分のクレームセットにこの特定のクレームを持っている場合、「アカウント」コントローラーの「RegisterUser」アクションにリダイレクトする必要があります。

これは単純かもしれませんが、私はこのシナリオの論理的な解決策を見つけていません。誰か助けてもらえますか?

4

3 に答える 3

3

私の問題に対して私が見つけた解決策は、この単純な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();
    }
}

プリンシパルのクレームセットで特定のクレームをチェックし、見つかった場合、ユーザーは特定のコントローラーとアクションにリダイレクトされます。

于 2013-03-27T10:45:41.453 に答える
1

これを行うWifスタイルの方法は、ClaimsAuthorizationManagerを使用することです(@leastprivilegeの記事に感謝します)。

try
{
    ClaimsPrincipalPermission.CheckAccess(“User”, “Newbie”);
}
catch (SecurityException ex)
{
    RedirectToAction("RegisterUser", "Account");
}

CheckAccessはClaimsAuthorizationManager.CheckAccess()と呼ばれ、この一連のアクション、リソース、およびプリンシパルの具体的なクレームチェックを実装します。

var principal = (ClaimsPrincipal)Thread.CurrentPrincipal;
if (principal != null)
{
     var newUserClaim =  principal.Claims.SingleOrDefault(c => string.Compare(c.Type, "http://xml/claims/newUser", StringComparison.InvariantCultureIgnoreCase) == 0)
}

更新最も簡単な方法は、プリンシパルのHasClaim()メソッドです。

var principal = (ClaimsPrincipal)Thread.CurrentPrincipal;
If (principal.HasClaim("http://xml/claims/newUser", "true")) 
{
    RedirectToAction("RegisterUser", "Account");
}
于 2013-03-26T19:26:34.733 に答える
0

ユーザーをログインページに自動的にリダイレクトするClaimsAuthorizeという名前の属性を持つThinktecture.IdentityModelを使用できます。Thinktecture.IdentityModelを使用するには、Nugetを使用してMVCアプリケーションにパッケージを追加する必要があります

Install-Package Thinktecture.IdentityModel

すでにClaimsPrincipalPermissionを使用している場合は、アプリケーションでクレームをチェック/オーロライズするためのClaimsAuthorizationManagerクラスがすでにあります。その場合、他に何もする必要はありません。これで、MVCアクションメソッドを次のように装飾できます。

[ClaimsAuthorize("View", "About")]
public ActionResult About(int id=0)
{

    return View();
}

現在ログインしているユーザーが「About」リソースに対する「View」アクションのクレームを持っていない場合、そのユーザーはログインページにリダイレクトされます。

于 2014-04-05T19:08:28.207 に答える