IIS でホストされ、セキュリティや認証をまったく提供しないサードパーティのデータ視覚化ツール (Silverlight で作成) があります (つまり、サーバーにアクセスでき、URL を知っている場合は、公開されているすべてのデータを表示できます。 ODBC 接続の資格情報)。ログインしたユーザーに基づいて適切な認証とアクセス制限を提供する別のアプリケーションを作成しました。サードパーティのアプリを「保護」するための現在の解決策は、ユーザーがアプリからアクセスしたことを確認することです。URL をチェックするために Referer ヘッダーを介してそれを行っているようです。
既存の認証とアクセス許可を使用してサード パーティ アプリケーションへのアクセスを制御するモジュールをパイプラインに追加できるかどうか疑問に思っています (現在、セッション認証とフォーム認証を組み合わせて使用していますが、クレームで書き換える可能性があります)。うまくいくように聞こえますが、そのようなことを試した経験のある人はいますか? 落とし穴?全体的に悪い考えですか?
更新: エントリ ポイントとしていくつかのページを持つ単なる ASP.Net アプリであることをベンダーに確認したので、フォーム認証を追加できるはずです。共有フォーム Cookie を使用できるようにしようとしていますが、今のところうまくいきません。私たちのサイト (localhost/MainApp) とベンダー サイト (localhost/Vendor) の各 web.config にこれがあります。
<authentication mode="Forms">
<forms name=".ASPXFORMSAUTH" loginUrl="Login.aspx" protection="All" timeout="20" path="/" />
</authentication>
<machineKey
validationKey="C50B3C89CB21F4F1422FF158A5B42D0E8DB8CB5CDA1742572A487D9401E3400267682B202B746511891C1BAF47F8D25C07F6C39A104696DB51F17C529AD3CABE"
decryptionKey="8A9BE8FD67AF6979E7D20198CFEA50DD3D3799C77AF2B72F"
validation="SHA1"/>
記録として、これらは本番環境で使用するキーではなく、MSDN サンプルから取得したものです。
ベンダーの global.asax ファイルを更新して (インストーラーで既に実行しています)、以下を追加しました。
protected void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs args)
{
System.Diagnostics.Debug.WriteLine("FormsAuthentication_OnAuthenticate");
if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
{
System.Diagnostics.Debugger.Break();
try
{
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value);
args.User = new System.Security.Principal.GenericPrincipal(new FormsIdentity(ticket), new string[0]);
if (!args.User.Identity.IsAuthenticated)
{
Context.Response.Redirect("~/Error.htm");
}
}
catch (Exception e)
{
Context.Response.Redirect("~/Error.htm?" + e.Message);
// Decrypt method failed.
}
}
else
{
Context.Response.Redirect("~/Error.htm?CookieNotFound");
}
}
しかし、今は「データを検証できません」というメッセージが表示されます。フォーム タグからドメインを削除した後、認証が機能するようになりました。サービス コールからそれを削除するだけで、準備は完了です (そうです、これでサービスが世界中に、または少なくともイントラネットにアクセスできるすべての人に開放されます)。