私は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 -->
}
}
認証されたユーザーの主張を確認するのに良い方法ですか、それとも従うべきベストプラクティスがありますか?よりクリーンで効率的なソリューションも歓迎します。
ASP.NETのすべてのIdentity
オブジェクトがClaimsIdentity
になったため、常に現在のIPrincipal
をClaimsIdentity
にキャストできます。
_((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);
}
_
拡張メソッドの利点は、クレームが存在するかどうかだけでなく、あらゆる種類のクレームをチェックし、それらに含まれる可能性のある値を返すことができることです。
プリンシパルには複数の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;
}