ASP.NET MVCフォーム認証および認証されていないコントローラーアクション
-
08-07-2019 - |
質問
フォーム認証を使用してロックダウンされたASP.NET MVCサイトがあります。 web.configには
があります<authentication mode="Forms">
<forms defaultUrl="~/Account/LogOn" loginUrl="~/Account/LogOn" timeout="2880"/>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
ユーザーが認証されない限り、アカウント/ログオン以外のページは表示できません。
現在、PayPal IPNをサイトに追加しようとしています。そのためには、PayPalの支払い確認とお礼のページを処理する2つのページが必要です。これらの2つのページは、匿名ユーザーが利用できる必要があります。
これらのページをアカウントコントローラーのコントローラーアクションにしたい。匿名ユーザーが使用できるようにする特定のアクションメソッドに属性を適用する方法はありますか?私はここでそれをしようとするいくつかの投稿を見つけましたが、ほとんどの人が反対のシナリオを望んでいました。
基本的に、 AccountController
クラスには、少数のメソッドを除いて、ほとんどのメソッドに対する権限を持たせないようにすることができます。現時点では、匿名ユーザーはLogOnメソッドしか使用できないようです。
解決
はい、できます。 AccountControllerには、クラスレベル(コントローラー全体を制限するため)または特定のメソッドのいずれかに[Authorize]属性があります。
特定のアクションを制限するには、これらのアクションを処理するメソッドでAuthorize属性を使用し、コントローラークラスを無制限のままにします。
ここにいくつかの例があります...それが役立つことを願っています
ユーザーにログインを要求するには、次を使用します:
[Authorize]
public class SomeController : Controller
// Or
[Authorize]
public ActionResult SomeAction()
特定のロールのアクセスを制限するには、次を使用します。
[Authorize(Roles = "Admin, User")]
public class SomeController : Controller
// Or
[Authorize(Roles = "Admin, User")]
public ActionResult SomeAction()
特定のユーザーのアクセスを制限するには、次を使用します:
[Authorize(Users = "Charles, Linus")]
public class SomeController : Controller
// Or
[Authorize(Users = "Charles, Linus")]
public ActionResult SomeAction()
ご覧のとおり、クラスレベルまたはメソッドレベルで属性を使用できます。あなたの選択!
他のヒント
&quot; Unauthorize&quot;があるとは思わないアクションに適用できる属性。&quot; [Authorize]&quot;を配置したくない場合コントローラーの2つを除くすべてのアクションで、次を試してください。
私が考えることができる2つの方法があります:
1- Web.configの場所属性(これがMVCルーティングなどで機能するかどうか不明)
後
<system.web> stuff </system.web>
web.configファイルで、次を追加します。
<location path="Account/ActionOne">
<system.web>
<authorization>
<allow users ="*" />
</authorization>
</system.web>
</location>
Account / ActionOneは、匿名アクセスを許可するアクションメソッドの名前です。 2番目のアクションについては、上記のコードをコピーしてその直後に貼り付け、アクションの名前を変更します。
MVCルーティングなどが原因でこれが機能するかどうかはわかりませんが、試してみてください。
2-ベースコントローラー
前のソリューションが機能しない場合、最善の策は、Authorize属性で装飾されたベースコントローラーを作成することです:
[Authorize]
public class AuthorizeControllerBase : Controller {}
次に、すべてのコントローラーが継承します:
public class AccountController : AuthorizeControllerBase
{
// your actions etc.
}
これにより、AuthorizeControllerBaseを継承するコントローラーは、メソッドを呼び出すために承認/ログインが必要になります。
その後、web.configから削除する必要があります
ウェブサイト上のすべてのリソースをデフォルトで保護してから、個々のリソースに匿名アクセスを提供する方法を探す代わりに、おそらく反対のアプローチを取る方が良いでしょう。 web.configで承認ルールを指定しないで、承認フィルター(Mickelの回答を参照)を使用して、個々のコントローラーやアクションを保護してください。