WIFシングルサインオンサーバーからのクレームベースの承認を使用するFubuMvcWebサイトがあります。認証はSSOで行われ、役割と一連のカスタムクレームを含むクレームが承認のためにWebサイトに渡されます。
SSOとWebサイトは、役割ベースの承認と同様に正常に機能しますが、私がやりたいのは、カスタムクレームがないことに基づいて、サイト全体へのアクセスを拒否してエラーページを保存することです。ClaimsAuthenticationManager
現在、クレームを検査し、必要なクレームの存在をチェックするカスタムを使用しています。クレームが欠落している場合は、例外がスローされます。これにより500エラーが発生しますが、私が本当に望んでいるのは、システムが401エラーをスローし、Webサイトの許可されていないページにリダイレクトすることです。
以下は、カスタムの例ですClaimsAuthenticationManager
。
public class CustomAuthenticationManager : ClaimsAuthenticationManager
{
private readonly string expectedClaim;
public CustomAuthenticationManager (object config)
{
var nodes = config as XmlNodeList;
foreach (XmlNode node in nodes)
{
using (var stringReader = new StringReader(node.OuterXml))
using (var rdr = new XmlTextReader(stringReader))
{
rdr.MoveToContent();
rdr.Read();
string claimType = rdr.GetAttribute("claimType");
if (claimType.CompareTo(ClaimTypes.CustomClaim) != 0)
{
throw new NotSupportedException("Only custom claims are supported");
}
expectedSystemName = rdr.GetAttribute("customClaimValue");
}
}
}
public override IClaimsPrincipal Authenticate(
string resourceName, IClaimsPrincipal incomingPrincipal)
{
var authenticatedIdentities = incomingPrincipal.Identities.Where(x => x.IsAuthenticated);
if (authenticatedIdentities.Any() &&
authenticatedIdentities.Where(x => x.IsAuthenticated)
.SelectMany(x => x.Claims)
.Where(x => x.ClaimType == ClaimTypes.CustomClaim)
.All(x => x.Value != expectedClaim))
{
throw new HttpException(
(int)HttpStatusCode.Unauthorized,
"User does not have access to the system");
}
return base.Authenticate(resourceName, incomingPrincipal);
}
}
上記は機能し、システムへのアクセスを妨げますが、ユーザーが500エラーを受け取るだけなので、tiはあまり使い勝手が良くありません。また、ユーザーは基本的にログインしていますが、アクセス権がないため、ログアウトする方法がありません。匿名ユーザーへのアクセスを提供する不正なエラーページを公開しましたが、ユーザーをリダイレクトする方法はまだありません。