none
AzureADの組織認証をしたユーザー名を基にテーブルから1行のみデータ取得の実装方法について RRS feed

  • 質問

  • 初めまして、ASP.NET MVCを初めて間もないものです。
    タイトルの内容について質問いたします。

    Webアプリでやりたいことは、AzureADの組織認証をしたユーザー名を基に、
    テーブルのIdentityName 列で同じ値を持つ1行のみをViewに渡して見せたいのですが、
    コントローラーは以下の実装でなにか問題ありますか?
    (セキュリティ、コードの保守性、MVCのお作法など)

    テストするかぎり、意図通り動いているようですが。。

    お分かりになる方がいらっしゃいましたら、ご教授頂けると幸いです。
    どうぞよろしくお願いいたします。

    ...

    ▼モデル(投稿のためにモデル名など一部修正)
    namespace test.Models
    {
     public class User
     {
      public int Id { get; set; }
      public string IdentityName { get; set; }
      public string Name { get; set; }
    ・・中略・・・

    -------
    ▼コントローラー
    namespace test.Controllers
    {
     public class UsersController : Controller
     {
      private testContext db = new testContext();
      public ActionResult Details()
      {
       if (!string.IsNullOrEmpty(User.Identity.Name))
       {
        var username = User.Identity.Name;
        var user = db.Users.SingleOrDefault(u => u.IdentityName == username);
        User user= user;

        if (detail == null)
        {
         return HttpNotFound();
        }
       return View(user);
       }
      return HttpNotFound();
      }
    ・・中略・・・
    (デフォルトのpublic ActionResult Index()は削除)
    ------------------------------
    ▼ビュー
    Scaffolding機能で作成したもの


    2015年5月29日 9:17

回答

  • ご自分の環境を書いてください、今回特に重要なのは OS, .NET, IIS, VS, MVC のバージョン、VS でプロジェクトを作成する時使用したテンプレートなどの情報です。

    > AzureADの組織認証をしたユーザー名を基に、

    とか言われても訳がわからないですが、とにかく User.Identity.Name で認証済みユーザー ID(未認証の場合は空文字)を取得できるということでいいのですよね?

    それから、アップされたコードは間違ってませんか? 特に以下の部分(user が二重定義、detail は宣言されてない)。

    var user = db.Users.SingleOrDefault(u => u.IdentityName == username);
    User user= user;
     
    if (detail == null)
    

    とりあえず、今見えている範囲で自分の意見を書きます。

    (1) 認証済みかどうかをチェックするなら string.IsNullOrEmpty(User.Identity.Name) ではなくて、Request.IsAuthenticated を使用することをお勧めします。

    (2) HttpNotFoundResult は HTTP 404 応答すなわち要求されたリソースが見つからなかったことを意味します。なので、アップされたコードのように HttpNotFoundResult を返すのは適切ではありません。

    以下のような感じでしょうか。

    public ActionResult Details()
    {
        if (Request.IsAuthenticated)
        {
            using (testContext db = new testContext();)
            {
                string username = User.Identity.Name;
                var user = db.Users.SingleOrDefault(u => u.IdentityName == username);                    
            }
        }
        else
        {
            // 未認証の場合の user を適宜作成。例:
            // var user = new User { Id = -1, Name = "匿名", IdentitiName ="なし" }
        }            
                
        return View(user);
    }
    

    • 回答としてマーク Masa104 2015年5月31日 6:17
    2015年5月29日 12:37

すべての返信

  • ご自分の環境を書いてください、今回特に重要なのは OS, .NET, IIS, VS, MVC のバージョン、VS でプロジェクトを作成する時使用したテンプレートなどの情報です。

    > AzureADの組織認証をしたユーザー名を基に、

    とか言われても訳がわからないですが、とにかく User.Identity.Name で認証済みユーザー ID(未認証の場合は空文字)を取得できるということでいいのですよね?

    それから、アップされたコードは間違ってませんか? 特に以下の部分(user が二重定義、detail は宣言されてない)。

    var user = db.Users.SingleOrDefault(u => u.IdentityName == username);
    User user= user;
     
    if (detail == null)
    

    とりあえず、今見えている範囲で自分の意見を書きます。

    (1) 認証済みかどうかをチェックするなら string.IsNullOrEmpty(User.Identity.Name) ではなくて、Request.IsAuthenticated を使用することをお勧めします。

    (2) HttpNotFoundResult は HTTP 404 応答すなわち要求されたリソースが見つからなかったことを意味します。なので、アップされたコードのように HttpNotFoundResult を返すのは適切ではありません。

    以下のような感じでしょうか。

    public ActionResult Details()
    {
        if (Request.IsAuthenticated)
        {
            using (testContext db = new testContext();)
            {
                string username = User.Identity.Name;
                var user = db.Users.SingleOrDefault(u => u.IdentityName == username);                    
            }
        }
        else
        {
            // 未認証の場合の user を適宜作成。例:
            // var user = new User { Id = -1, Name = "匿名", IdentitiName ="なし" }
        }            
                
        return View(user);
    }
    

    • 回答としてマーク Masa104 2015年5月31日 6:17
    2015年5月29日 12:37
  • SurferOnWwwさん

    ご回答ありがとうございます。
    情報が不足していてすみません。
    環境を書きます。

    --------------------------------
    開発環境
    Windows7
    .NET 4.5
    Visual Studio 2013 Express for Web
    テスト:IIS Express
    本番:Azure Websites
    MVC:MVC5?(VC2013 Webを入れただけの状態です)
    テンプレート:ASP.NEt Webアプリ C#> MVC
     ・認証の変更>組織アカウント(クラウド-単一組織)
     ・クラウド内のホスト:オン(Web App)
    --------------------------------

    ご提示頂いた内容大変参考になります!
    どうもありがとうございました!

    2015年5月31日 6:17