11

サーバーに中央認証アプリケーションがあります。サーバーbには、サーバーaから認証する必要がある同じドメイン上の1つ以上のアプリケーションがあります。サーバーbアプリがサーバーaにリダイレクトされるように設定するのは簡単です。それほど簡単ではないのは、ReturnURLを絶対にすることです。

これがしわです。サーバーbの消費アプリには、パブリックとセキュアの2つのコントローラーがあります。[authorize]装飾がパブリック(デフォルトのコントローラー)のアクションに配置されている場合、適切な絶対URLを取得します。ただし、それが独自のコントローラーにある場合は、相対URLを取得します。

消費するアプリケーションで事前リクエストイベントをインターセプトすることはできますが、スマッシュ全体ではなく、サイトの一部を公開する必要があります。

アイデア?

4

3 に答える 3

16

標準の AuthorizeAttribute が機能する方法は、要求が認証されていない場合に応答ステータス コードを 401 に設定することです。これにより、未承認のリクエストに対するデフォルトの認証モジュールの標準的な応答が開始されます。フォームベースの認証を使用していると仮定します。これは、リクエストの URL に基づいて戻り URL を構築します。この場合、おそらく相対 URL です。

できることの 1 つは、組み込みの動作に依存する代わりに、AuthorizeAttribute クラスを拡張して OnAuthorization をオーバーライドする SSOAuthorizeAttribute を実装することです。次に、Web 構成のフォーム要素から loginUrl を抽出し、独自の RedirectResult を構築して、AuthorizationContext パラメーターの HttpContext.Request.Url.AbsoluteUri プロパティから returnUrl を取得できます。

 public class SSOAuthorizeAttribute : AuthorizeAttribute
 {
      public override void OnAuthorization( 
                          AuthorizationContext filterContext )
      {
          if (filterContext == null)
          {
              throw new ArgumentNullException( "filterContext" );
          }

          if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
          {
              // get from cached variable from web configuration
              string loginUrl = ... 
              if (filterContext.HttpContext.Request != null)
              {
                  loginUrl += "?ReturnUrl=" + filterContext.HttpContext
                                                           .Request
                                                           .Url
                                                           .AbsoluteUri;
              }

              filterContext.Result = new RedirectResult( loginUrl );
          }
      }
 }
于 2008-12-18T22:43:26.847 に答える
5

フォーム認証を前提として、サーバー B アプリの web.config で、フォーム タグの loginUrl 属性を、サーバー A にリダイレクトする前に絶対 URL を追加するコントローラー アクション メソッドに設定します。

サーバー B の構成

<authentication mode="Forms">
  <forms loginUrl="/Account/LoginRedirect" />
</authentication>

アクションメソッドは次のようになります

 public RedirectResult LoginRedirect(string returnUrl)
    {
       var requestUrl = HttpContext.Current.Request.Url;
       return LoginUrlOnServerA + 
              "?returnUrl=" +          
              HttpUtility.UrlEncode(string.Format("http://{0}:{1}{2}",
                requestUrl.Host,
                requestUrl.Port,
                HttpUtility.UrlDecode(returnUrl)));
     }
于 2009-02-24T21:05:54.647 に答える
0

https://stackoverflow.com/a/583608/80589としてしかし短い:

public RedirectResult LogOn(string returnUrl)
{
  var r = new Uri(Request.Url, returnUrl).ToString();
  return Redirect("https://logonserver.com/?return_url=" + Url.Encode(r));
}
于 2012-06-04T09:23:37.267 に答える