none
ASP.NET Identityでユーザーログイン後でしかアクセスできないページを作成したい RRS feed

  • 質問

  • visual studio express 2013 for webからmvcテンプレートで勉強しています。
    テンプレートのユーザー登録画面でユーザーを作成し、ログイン・ログアウトは出来るのですが
    特定のページをログインしていなければ別ページに遷移する方法が分かりませんでした。
    詳しく載っているようなサイト等をご教授できないでしょうか。

    ~追記~

    諸説調べ、以下のサイトを観ながらロールによるアクセス制限を行ってみました。

    ASP.NETでRoleを用意する
    http://blog.qaramell.com/?p=14101

    どうやら下記実装で制御可能でした

    [Authorize(Roles = "ここにロール名")]

    AspNetRolesとAspNetUserRolesがどう結びついているのかを調べればなんとかできそうなのですが、AspNetRolesとAspNetUserRolesの単語で調べてみても詳しく載っているサイトが見つからず、という状態です。

    2014年11月8日 19:54

回答

  • > ロールによるアクセス制限を行ってみました。

    ログインできた(認証が通った)だけではアクセスを許可せず、さらにロールによるアクセス制限(認証後さらに承認されたユーザーのみアクセスを許可する)も行いたいということですか?

    質問さんは、先の私のレス「認証を受けてない(ログインしていない)ユーザーが、匿名アクセスの許可されてない特定のアクションメソッドにアクセスしたとき、ログインページにリダイレクトされるということでいいのですか?」に、

    > SurferOnWww様のおっしゃる通りの事を実現したいと思っております。

    と返信されてますが、それとちょっと(かなり?)違うことは理解されているでしょうか?

    上で「匿名アクセスの許可されてない・・・」というのは、逆に言えば、ログインしていれば(認証されていれば)誰でもアクセス可能ということで、そこまででよければロールによる制限(承認)は不要という意味なのですが。

    認証だけでよければ、コントローラーのクラスまたは個々のアクションメソッドに [Authorize] 属性を付与すれば匿名ユーザーのアクセスは制限できます。

    そうではなくて、認証に加えてロールによる承認も行いたいということですか? まずそのあたりを明確にしてください。


    【追伸】

    認証だけなら、Visual Studio のテンプレートで自動生成される AccountController.cs のコードが参考になりませんか?

    たぶん、以下のようになっていると思いますが、[Authorize] 属性をコントローラーのクラスに付与してクラス全体の匿名ユーザーのアクセスを不許可にした上で、Login など匿名ユーザーのアクセスを許可するアクションメソッドのみ [AllowAnonymous] 属性(匿名ユーザーの許可)が付与されているはずです。

    namespace MvcApplication1.Controllers
    {
        [Authorize]
        [InitializeSimpleMembership]
        public class AccountController : Controller
        {
    
            // ・・・中略・・・
    
            [HttpPost]
            [AllowAnonymous]
            [ValidateAntiForgeryToken]
            public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
            {
    
                // ・・・中略・・・
    
            }
    
            // ・・・中略・・・
    
        }
    }

    上記とは逆に、クラスには [Authorize] 属性を付与せず、匿名ユーザーのアクセスを許可しないアクションメソッドのみに [Authorize] 属性を付与して制限することもできます。
    • 編集済み SurferOnWww 2014年11月16日 3:52 追伸追加&誤字訂正
    • 回答としてマーク s_tsurumaki 2014年11月17日 18:11
    2014年11月16日 3:20

すべての返信

  • visual studio express 2013 for webなのでMVC5ですよね?
    この辺り、あまり実装経験がなく知識だけなので外しているかもしれませんが、以下が参考になりそうに思います。

    ASP.NET MVC 5 で追加された IAuthenticationFilter と Authorize 属性の関係
    http://blog.shibayan.jp/entry/20130627/1372344222


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2014年11月9日 0:53
    モデレータ
  • > 特定のページをログインしていなければ別ページに遷移する方法が分かりませんでした。

    上記の意味がよく分かりません。

    まず MVC には Web Forms で言うページはないのですが、質問の「特定のページ」というのはコントローラーの特定のアクションメソッドということですか?

    で、認証を受けてない(ログインしていない)ユーザーが、匿名アクセスの許可されてない特定のアクションメソッドにアクセスしたとき、ログインページにリダイレクトされるということでいいのですか?


    • 編集済み SurferOnWww 2014年11月9日 4:06 誤記訂正
    2014年11月9日 4:05
  • お世話になります、ご回答ありがとうございます。

    また、返事に時間がかかり申し訳御座いませんでした。

    調べると[AllowAnonymous]や[BasicAuthentication]でアクセス制御が可能だと思うのですが、

    [AllowAnonymous]以外に他に何があればわかれば解決しそうだと思うのです(根本的に間違ってたらすみません)

    ただ、AllowAnonymousだけで調べても種類や制御に関する一覧の記述を見つける事ができず途方に暮れています。

    2014年11月15日 15:57
  • お世話になります、ご回答ありがとうございます。

    また、返事に時間がかかり申し訳御座いませんでした。

    • 認証を受けてない(ログインしていない)ユーザーが、匿名アクセスの許可されてない特定のアクションメソッドにアクセスしたとき、ログインページにリダイレクトされるということでいいのですか?

    SurferOnWww様のおっしゃる通りの事を実現したいと思っております。

    2014年11月15日 15:59
  • > ロールによるアクセス制限を行ってみました。

    ログインできた(認証が通った)だけではアクセスを許可せず、さらにロールによるアクセス制限(認証後さらに承認されたユーザーのみアクセスを許可する)も行いたいということですか?

    質問さんは、先の私のレス「認証を受けてない(ログインしていない)ユーザーが、匿名アクセスの許可されてない特定のアクションメソッドにアクセスしたとき、ログインページにリダイレクトされるということでいいのですか?」に、

    > SurferOnWww様のおっしゃる通りの事を実現したいと思っております。

    と返信されてますが、それとちょっと(かなり?)違うことは理解されているでしょうか?

    上で「匿名アクセスの許可されてない・・・」というのは、逆に言えば、ログインしていれば(認証されていれば)誰でもアクセス可能ということで、そこまででよければロールによる制限(承認)は不要という意味なのですが。

    認証だけでよければ、コントローラーのクラスまたは個々のアクションメソッドに [Authorize] 属性を付与すれば匿名ユーザーのアクセスは制限できます。

    そうではなくて、認証に加えてロールによる承認も行いたいということですか? まずそのあたりを明確にしてください。


    【追伸】

    認証だけなら、Visual Studio のテンプレートで自動生成される AccountController.cs のコードが参考になりませんか?

    たぶん、以下のようになっていると思いますが、[Authorize] 属性をコントローラーのクラスに付与してクラス全体の匿名ユーザーのアクセスを不許可にした上で、Login など匿名ユーザーのアクセスを許可するアクションメソッドのみ [AllowAnonymous] 属性(匿名ユーザーの許可)が付与されているはずです。

    namespace MvcApplication1.Controllers
    {
        [Authorize]
        [InitializeSimpleMembership]
        public class AccountController : Controller
        {
    
            // ・・・中略・・・
    
            [HttpPost]
            [AllowAnonymous]
            [ValidateAntiForgeryToken]
            public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
            {
    
                // ・・・中略・・・
    
            }
    
            // ・・・中略・・・
    
        }
    }

    上記とは逆に、クラスには [Authorize] 属性を付与せず、匿名ユーザーのアクセスを許可しないアクションメソッドのみに [Authorize] 属性を付与して制限することもできます。
    • 編集済み SurferOnWww 2014年11月16日 3:52 追伸追加&誤字訂正
    • 回答としてマーク s_tsurumaki 2014年11月17日 18:11
    2014年11月16日 3:20
  • お世話になります。

    試行錯誤、説明不足で失礼致しました。

    SurferOnWww様のおっしゃる通り認証されていれば誰でもアクセス可能という単純な仕組みを調べるつもりでしたが、ロールの存在を知りそちらで作成を進めていました。

    AccountController.csの内容参考になりました。あまり中を見ていませんでしたが、 各属性を付けて挙動がどうなるか確かめていきます。

    2014年11月17日 18:11