2009-05-04 27 views
0

私たちはサイトにformsAuthenticationを実装しようとしていますが、独自のHttpModuleを作成してカスタム私自身論理的なものだったので、これが確かに唯一の解決策であるかどうかを確かめるためにそこに質問を投げかけたいと思った。サイト内の複数のサブフォルダに対してFormsAuthenticationを有効にする

カスタムメンバーシッププロバイダの上でformsAuthenticationを使用したいが、異なるフォルダに対して異なるプロバイダを使用したいと思う。私たちのサイトでは、これらのセクションをサブフォルダ(たとえば、〜/ Admin、〜/ GoldCustomer、〜/ SilverCustomer、〜/ BronzeCustomer)で分割しているため、各セクション/サブフォルダごとに異なるメンバーシッププロバイダを使用したいと考えています。ランタイムエラーが発生してもこれを行う

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> 
<location path="Admin"> 
<system.web> 
    <authentication mode="Forms"> 
    <forms name="AdminAuth" loginUrl="~/AdminLogin.aspx" /> 
    </authentication> 
    <membership defaultProvider="AdminProvider" > 
    <providers > 
     <add connectionStringName="ConnString" name="AdminProvider" type="Assembly.AdminMembershipProvider" ... /> 
    </providers> 
    </membership> 
</system.web> 
</location> 
<location path="GoldCustomer"> 
    <system.web> 
    <authentication mode="Forms"> 
    <forms name="GoldCustomerAuth" loginUrl="~/GoldCustomerLogin.aspx" /> 
    </authentication> 
    <membership defaultProvider="GoldCustomerProvider" > 
    <providers > 
     <add connectionStringName="ConnString" name="GoldCustomerProvider" type="Assembly.GoldCustomerMembershipProvider" ...="" /> 
    </providers> 
    </membership> 
</system.web> 
</location> 
<system.web> 
    <compilation debug="true" /> 
    <authentication mode="Forms" /> 
</system.web> 
</configuration> 

:これをサポートするためのフレームワークを使用して、我々は次のように私たちのweb.configファイルを実装したい

てallowDefinition =として登録セクションを使用するとエラーになり」 MachineToApplication 'はアプリケーションレベルを超えています。このエラーは、仮想ディレクトリがIISのアプリケーションとして構成されていないために発生します。

Line 11: <location path="Admin"> 
Line 12:  <system.web> 
Line 13:  <authentication mode="Forms"> 
Line 14:   <forms name="FormsAdmin" loginUrl="~/login.aspx" /> 
Line 15:  </authentication> 

我々がしようとしているものを達成する唯一の方法は、カスタムHttpModuleをしているようだ - または(IISで別のWebアプリケーションにフォルダを分割するように)我々のアプローチを変更します。これは正しいのですか、何か不足していますか?それとも私が気づいていない他の選択肢がありますか?

ありがとうございました!

+0

あなたはメンバーシップ・プロバイダのみが許可されています。これは、アプリケーションinitでロードされキャッシュされます。これを行う必要がある各プロバイダとは何が違うのですか? – typemismatch

答えて

1

まず、ロールベースのセキュリティは、データベースを管理している場合は、アプリケーションに最適です。しかし、あなたがそれを変更することができない場合、それは無駄です。

代わりの解決策は、ReturnUrlクエリーストリング変数に基づいてユーザーをフォルダ固有のログインフォームにリダイレクトするゲートウェイログインフォームであり、そのフォームはユーザーを検証するプロバイダーを使用します。次に、FormsAuthentication.RedirectFromLoginPageを使用して認証Cookieを設定し、前のページにリダイレクトします。ロールを設定し、ロールベースのセキュリティを使用して、<authorization>タグがweb.configの各フォルダへのアクセスを制御できます。

+0

私は、彼が役割を使って何度もやっていることを正確に行いました - そしてあなたは正しい - これはまさに役割が何を意味するのかです - 異なるレベルでのアクセスを承認することです。 –

+0

ああ、そうだよ、RBSだよ!私は気にしていなかった理由は、私たちが異なるIIdentityの実装を使ってユーザを表現しようとしているということです。 AdminIdentiyにはName、CompanyExtensionNumber、IsGodなどのプロパティがありますが、GoldCustomerIdentityにはNumberOfDaysBeenCustomerなどのプロパティがあります。したがって、IIdentityの各タイプは固有のプロパティ/動作です。 User.IsInRole( "Admin")の場合、IIdentityをダウンキャストするファクトリを持っていて、SecurityExceptionをスローしなければならないというこの問題に対する最良の答えですか? – mallio

+0

@mallo:本当に自分自身でIIdentityオブジェクトを発行したいのであれば、HttpModuleが最善の策だと思います。 –

0

私はあなたが何をしようとしているのかよく分かりませんが、これらの顧客タイプごとにどのように役割を果たしていますか?各サブフォルダのロールによるアクセスを制限しますが、1つのメンバーシッププロバイダと1つのロールプロバイダがあります。

関連する問題