トップ回答者
AzureADの組織認証をしたユーザー名を基にテーブルから1行のみデータ取得の実装方法について

質問
-
初めまして、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機能で作成したもの
回答
-
ご自分の環境を書いてください、今回特に重要なのは 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
すべての返信
-
ご自分の環境を書いてください、今回特に重要なのは 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
-
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)
--------------------------------ご提示頂いた内容大変参考になります!
どうもありがとうございました!