私は数日前にこの問題に遭遇し、解決策は少し詳細ですが、ここに重要な部分があります。このメソッドでは、承認が失敗したときにを返しAuthorizeAttribute
ます。これにより、カスタム結果を返すのが少し難しくなります。OnAuthorization
HttpUnauthorizedResult
私がやったことは、CustomAuthorizeAttributeクラスを作成し、OnAuthorizationメソッドをオーバーライドして、代わりに例外をスローすることでした。次に、カスタムエラーハンドラーを使用してその例外をキャッチし、401(Unauthorized)を返す代わりに、カスタマイズされたエラーページを表示できます。
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public virtual void OnAuthorization(AuthorizationContext filterContext) {
if (filterContext == null) {
throw new ArgumentNullException("filterContext");
}
if (AuthorizeCore(filterContext.HttpContext)) {
HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
cachePolicy.SetProxyMaxAge(new TimeSpan(0));
cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */);
}
else {
// auth failed, redirect to login page
// filterContext.Result = new HttpUnauthorizedResult();
throw new HttpException ((int)HttpStatusCode.Unauthorized, "Unauthorized");
}
}
}
次に、web.configで、特定のエラーのカスタムハンドラーを設定できます。
<customErrors mode="On" defaultRedirect="~/Error">
<error statusCode="401" redirect="~/Error/Unauthorized" />
<error statusCode="404" redirect="~/Error/NotFound" />
</customErrors>
次に、独自のErrorControllerを実装して、カスタムページを提供します。
Response.TrySkipIisCustomErrors = true;
IIS7では、カスタムエラーを有効にするための設定を調べる必要があります。