web-dev-qa-db-ja.com

MVC5要求バージョンのAuthorize属性

MVS5と新しいOWIN認証ミドルウェアを使用して、VS2013 RCの新しいものをいくつか試しています。

そのため、_[Authorize]_属性を使用してアクションをロールごとに制限することに慣れていますが、クレーム/アクティビティベースの承認を使用しようとしていますが、同等の属性が見つかりません。

紛失している明らかなものはありますか、それとも自分で転がす必要がありますか?すぐに使えるようになると思っていました。

私が特に探しているのは、[Authorize("ClaimType","ClaimValue")]の行に沿ったものです。

前もって感謝します。

75
Stimul8d

私はそれを処理する単純な属性を書くことになりました。余分な設定がなければ、フレームワーク内ですぐに何かを見つけることはできませんでした。以下に記載されています。

public class ClaimsAuthorizeAttribute : AuthorizeAttribute
{
    private string claimType;
    private string claimValue;
    public ClaimsAuthorizeAttribute(string type, string value)
    {
        this.claimType = type;
        this.claimValue = value;
    }
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        var user = filterContext.HttpContext.User as ClaimsPrincipal;
        if (user != null && user.HasClaim(claimType, claimValue))
        {
            base.OnAuthorization(filterContext);
        }
        else
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}

もちろん、クレームにcontroller-action-verb tripletを使用することに満足している場合は、タイプと値のパラメーターを削除できます。

66
Stimul8d
  1. クレームを具体的にチェックするのではなく、アクション/リソースのペアをチェックします。実際のクレーム/データチェックを承認マネージャーに含めます。関心事の分離。
  2. MVCとClaimsPrincipalPermissionはよく一致しません。 SecurityExceptionをスローし、ユニットテストに対応していません。

私のバージョンはこちらです: http://leastprivilege.com/2012/10/26/using-claims-based-authorization-in-mvc-and-web-api/

30
leastprivilege

クレームを使用して、ロールとユーザーでAuthorization属性を引き続き使用できることがわかりました。
これが機能するには、ClaimsIdentityに2つの特定のクレームタイプを含める必要があります。

_    ClaimTypes.Name
_

そして

_    ClaimTypes.Role
_

次に、OAuthAuthorizationServerProviderから派生したクラスで、使用するGrantXXメソッドで、ClaimsIdentityを作成するときに、これら2つのクレームを追加します。

例:

_    var oAuthIdentity = new ClaimsIdentity(new[]
    {
        new Claim(ClaimTypes.Name, context.ClientId),
        new Claim(ClaimTypes.Role, "Admin"),
    }, OAuthDefaults.AuthenticationType);
_

その後、任意のアクションで[Authorize(Roles ="Admin")]を使用してアクセスを制限できます。

8
Softlion
[ClaimsPrincipalPermission(SecurityAction.Demand, Operation="Delete", Resource="Customer")]
public ActionResult Delete(int id)
{
    _customer.Delete(id);
    return RedirectToAction("CustomerList");
}

ClaimsPrincipalPermissionAttributeクラス

3
jd4u