問題
簡単に言えば、許可されていない ChildActions が 401 コードを返し、代わりに空の結果を返すのを防ぐにはどうすればよいでしょうか。
環境
私のアプリケーションはNTLMを使用してネットワーク上で認証します。また、 NTLM非対応デバイスの場合、または誰かがプロキシを経由する場合に、匿名の識別を処理したいと考えています。
Web アプリケーションの 1 つには、表示可能にするために絶対にログインする必要があるコントローラー/アクションと、匿名として表示できるものがあります。私が最初に以下を使用した場所で認証が必須であるものについては:
[Authorize()]
public class SomeController : BaseController
これは期待どおりに機能し、 401 Status Code (Unauthorized)を返します。
問題は、匿名を許可するページから始まります。これらのページには、RenderAction を使用して認証が必要な部分をレンダリングする部分があるためです。
フロントエンドのローカル開発サーバーではすべて問題ないように見えますが、IISを使用すると、認証が必要な小さな部分を含むすべてのページで 401 ページが返されます。そこで、カスタム Authorize 属性を作成しました。
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public bool Ignore401ChildAction { get; set; }
public CustomAuthorizeAttribute()
: base() {
this.Ignore401ChildAction = true;
}
protected override void HandleUnauthorizedRequest( AuthorizationContext filterContext ) {
base.HandleUnauthorizedRequest( filterContext );
if( this.Ignore401ChildAction && filterContext.IsChildAction ) {
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
}
}
そして、フロントエンドでは、IIS の有無にかかわらず正しい動作を生成するようです。ただし、バックエンドでは、ページが完全にレンダリングされても 401 が返されます
そこで、TrySkipIisCustomErrors の代わりにCustomAttributeに以下を追加しました
filterContext.HttpContext.Response.StatusCode = 200;
filterContext.Result = new EmptyResult();
匿名ではすべて問題ありませんが、NTLM が有効になっている場合、コントローラーにその CustomAuthorize 属性がない場合、サーバーは認証を要求しません。資格情報が利用可能な場合ではなく、必須の場合にのみ資格情報を要求しているようです。
ありがとうございました、
編集
多くの検索、掘り下げ、いじりの後、本当の問題は、匿名の識別がWindows / NTLMよりも優先されることであることに気付きました。匿名認証とWindows認証が有効になっている場合、 Windowsは匿名認証が失敗した場合にのみ実行されます。
解決
(完璧ではなく、一種のハックですが、機能します)次の関数を BaseController に追加してから、認証が必須ではないビューから呼び出すか、単に_Layoutビューから呼び出します。
注: ページは匿名として正しく表示されますが、401 ステータス コードが返されます。
[CustomAuthorize]
public ActionResult Auth() {
return new EmptyResult();
}