2016-04-05 17 views
0

ASP.NET MVC 3でダイジェスト認証を実装する必要があります。そのためにAuthorizeAttributeとHttpUnauthorizedResultから継承しました。コードは次のとおりです。次のようにコントローラ/アクションのHttpUnauthorizedResult派生クラスでExecuteResultメソッドが呼び出されていません

[AttributeUsage (AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] 
public class SessionAuthorize: AuthorizeAttribute { 
    public override void OnAuthorization (AuthorizationContext actionContext) { 
     try { 
      if (null != actionContext.HttpContext.Request.Headers["Authorization"]) 
       // authorization is on the way 
       // <...> 
      else 
       actionContext.Result = new HttpDigestUnauthorizedResult(); 
     } catch (Exception ex) { 
      Trace.TraceWarning ("SessionAuthorize.OnAuthorization failed: {0}", ex.Message); 
     } 
     base.OnAuthorization (actionContext); 
    } 
} 

public class HttpDigestUnauthorizedResult: HttpUnauthorizedResult { 
    public HttpDigestUnauthorizedResult() : base() { 
    } 
    public override void ExecuteResult (ControllerContext context) { 
     if (context == null) 
      throw new ArgumentNullException ("context"); 
     // this is supposed to initialize digest authentification exchange 
     context.HttpContext.Response.AddHeader ("WWW-Authenticate", string.Format ("Digest realm=\"somerealm\",qop=\"auth\",nonce=\"{0}\",opaque=\"{1}\""/*, <...>*/)); 
     base.ExecuteResult (context); 
    } 
} 

コードは次のとおりです。

public class DefaultController: Controller { 
    [SessionAuthorize] 
    public ViewResult Index() { 
     return View(); 
    } 
} 

ので、それは特別な何もしていません。

ただし、オーバーライドされたExecuteResultは呼び出されず、標準401ページのみが返されます。私はここで何が欠けていますか?どこから電話を受けたExecuteResult

答えて

2

正しいパターンは、boolを使用して現在の要求が許可されているかどうかを確認し、HandleUnauthorizedRequestメソッドでこれらの不正な要求を処理します。 OnAuthorizationにすべてを入れるのは間違っています。OnAuthorizationの代わりに、the source codeに従って、場合によってはOnCacheAuthorizationメソッドが呼び出されるためです。

protected override bool AuthorizeCore(HttpContextBase httpContext) 
{ 
    if (httpContext.Request.Headers["Authorization"] == null) 
    { 
     return false; 
    } 

    return base.AuthorizeCore(httpContext); 
} 

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{ 
    filterContext.Result = new HttpDigestUnauthorizedResult(); 
} 
+0

ありがとう、それは問題があった場所です。 –

関連する問題