web-dev-qa-db-ja.com

役割の主張を効率的に確認する

私はAsp.NET MVC5 Webアプリケーション(.NET 4.6)を開発しており、特定の要求を持つユーザーのグループにHTMLの追加の行を表示する必要があります。私はいくつかの冗長なソリューションを見てきましたが、私はそれを短くしたいので、これを思いつきました

@{
    if (System.Security.Claims.ClaimsPrincipal.Current.Claims.ToList().FirstOrDefault(c => c.Type == "role" && c.Value == "AwesomeUserRole") != null) {
        <!-- my HTML goes here -->
    }
 }

認証されたユーザーの主張を確認するのに良い方法ですか、それとも従うべきベストプラクティスがありますか?よりクリーンで効率的なソリューションも歓迎します。

10
Naigel

ASP.NETのすべてのIdentityオブジェクトがClaimsIdentityになったため、常に現在のIPrincipalClaimsIdentityにキャストできます。

_((System.Security.Claims.ClaimsIdentity)User.Identity).HasClaim("role", "AwesomeUserRole")
_

しかし、実際にはUser.IsInRole("AwesomeUserRole")を使用するのが最も簡単です。

デフォルトの構成を変更していない限り、タイプがroleのクレームは、スレッドプリンシパルのロールコレクションに自動的にフィードされます。

役割以外に追加のクレームタイプをチェックする必要がある場合は、通常、クレームチェックをラップするIPrincipalの拡張メソッドのセットを作成します。

_public static bool CanDoX(this IPrincipal principal)
{
    return ((ClaimsIdentity)principal.Identity).HasClaim(claimType, claimValue);
}
_

拡張メソッドの利点は、クレームが存在するかどうかだけでなく、あらゆる種類のクレームをチェックし、それらに含まれる可能性のある値を返すことができることです。

24
Jimmie R. Houts

プリンシパルには複数のIDを関連付けることができることに注意してください。 Windows認証で認証しましたが、データベースからのクレームを含むカスタムIDを追加しました。

したがって、どのクレームチェックでもすべてのIDを調べる必要がある可能性があります。これは、役立ついくつかの拡張メソッドです

public static bool ClaimExists(this IPrincipal principal, string claimType)
{
    var ci = principal as ClaimsPrincipal;
    if (ci == null)
    {
        return false;
    }

    var claim = ci.Claims.FirstOrDefault(x => x.Type == claimType);

    return claim != null;
}

public static bool HasClaim(this IPrincipal principal, string claimType,
                            string claimValue, string issuer = null)
{
    var ci = principal as ClaimsPrincipal;
    if (ci == null)
    {
        return false;
    }

    var claim = ci.Claims.FirstOrDefault(x => x.Type == claimType
                                         && x.Value == claimValue
                                         && (issuer == null || x.Issuer == issuer));

    return claim != null;
}
14
Paul Hatcher