MVCのlayoutにユーザー情報を表示させるには

Category: fx aspnet_ja

Question

KN_NT on Wed, 22 Nov 2017 09:28:04


お世話になります。

C# MVC5にて開発しております。

ログイン後のユーザー情報(ユーザー名等)をlayout側に表示させておきたいのですが、全てのアクションでユーザー情報を取得するのではなく

ログイン直後に取得した情報を持ち回って、layoutの表示に埋め込む方法を考えています、思うようにいかずつまづいています。

私のイメージ的にはベースのコントローラーを作成し、ログイン後にユーザー情報の必要な項目をセッションに格納してから

ベースコントローラーで毎回セッション情報をみて、layoutに表示させる方法がよいかなと思っていますがなかなかうまく動作しません。

参考になる方法等ご教授いただけないでしょうか?

ちなみに、ログインはAzureのAD認証で、ユーザー情報はMicrosoft Graphを利用して、ユーザー名や部署等を取得するところまでできました。

Replies

SurferOnWww on Thu, 23 Nov 2017 03:46:10


Azure AD とか Graph API には触ったこともない自分がレスするのもなんですが・・・

質問者さんがやりたいことは、以下のようなことなのでしょうか?

(1) 以下の記事の「Graph APIを使ってAzure ADから属性を取得する」に書いてあるような実装を行っていて、そこまでは完了している。

[Azure AD/ASP.NET]ユーザ属性を取得する2つの方法
http://idmlab.eidentity.jp/2015/08/azure-adaspnet2.html

(2) ログイン ID(e-mail アドレス)に加えて、Graph APIを使って取得できるユーザ属性を _Layout.cshtml の右上に表示したい。以下の画像の赤枠で囲った部分のように。

(3) ただし、画面遷移のたびに毎回 Graph APIを使って Azure AD に情報を取りに行くのではなく、ログイン時に取得した情報を Cookie とか Session に保持してそれを使い回したい。

上記の理解が違っていたら、どこがどう違うのかを具体的に書いてください。

上記の理解が正しければ、そして、Azure AD ベースの認証でも以下の記事の「図4:ログオン処理イメージ 」と同様に ClaimsIdentity を OWIN に渡して認証クッキーをやり取りしているのであれば(これは想像ですが) 、認証クッキーに情報を追加できるか検討してはいかがでしょう?

ASP.NET Identityによるユーザー登録/ログインの仕組み
https://codezine.jp/article/detail/7763?p=3

上記の記事のように認証に「個別のユーザーアカウント」を選択した場合の例ですが、以下の記事のようにして認証クッキーに情報を追加し、画面遷移のたびいちいち SQL Server に紹介せず、クッキーから情報を取得するようにして使い回すことは可能です。

プロファイル情報を ClaimsIdentity へ追加
http://surferonwww.info/BlogEngine/post/2017/04/16/add-user-profile-information-to-claimsidentity.aspx

上記の記事は Web Forms アプリを例に使ってますが、MVC5 でも同じです。ただし、MVC5 の場合はマスターページではなく _LoginPartial.cshtml を使いますので、上の記事の一番最後のコードは違ってきます。

認証に「個別のユーザーアカウント」を選択した場合ですが、以下のようになります。

@using Microsoft.AspNet.Identity
@using Mvc5App.Models
@if (Request.IsAuthenticated)
{
    using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" }))
    {
    @Html.AntiForgeryToken()

    <ul class="nav navbar-nav navbar-right">
        <li>
            @Html.ActionLink(
                "Hello " + User.Identity.GetUserName() + "! " +
                "Phone:" + User.Identity.GetPhoneNumber(), 
                "Index", 
                "Manage", 
                routeValues: null, 
                htmlAttributes: new { title = "Manage" })
        </li>
        <li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li>
    </ul>
    }
}
else
{
    <ul class="nav navbar-nav navbar-right">
        <li>@Html.ActionLink("Register", "Register", "Account", routeValues: null, htmlAttributes: new { id = "registerLink" })</li>
        <li>@Html.ActionLink("Log in", "Login", "Account", routeValues: null, htmlAttributes: new { id = "loginLink" })</li>
    </ul>
}

KN_NT on Fri, 24 Nov 2017 01:41:23


SurferOnWwwさん

ご回答ありがとうございます。
取り急ぎ回答いたします。

(1) 以下の記事の「Graph APIを使ってAzure ADから属性を取得する」に書いてあるような実装を行っていて、そこまでは完了している。
[Azure AD/ASP.NET]ユーザ属性を取得する2つの方法
http://idmlab.eidentity.jp/2015/08/azure-adaspnet2.html
→その通りです。このサイトみてからGraph APIでデータを取得しようと決めました。ただし、調べているうちにAzureの「Graph API」は開発が停止しており
今後は「Microsoft Graph」のほうのAPIを利用することが推奨となっていたので、そっちを使っています。

(2) ログイン ID(e-mail アドレス)に加えて、Graph APIを使って取得できるユーザ属性を _Layout.cshtml の右上に表示したい。以下の画像の赤枠で囲った部分のように。
→イメージとしてはあっています。

(3) ただし、画面遷移のたびに毎回 Graph APIを使って Azure AD に情報を取りに行くのではなく、ログイン時に取得した情報を Cookie とか Session に保持してそれを使い回したい。
→その通りです。ユーザー名等はほぼ固定なので毎回とりにいきたくないです。


ちょっとずつ調べならがやっているので、わからないことが多い状態です。
(3)の内容で調べみます。

状況は、後ほどご報告します


KN_NT on Mon, 29 Jan 2018 08:11:44


現在別件で対応中のため、本件完了として

一度クローズさせていただきます。

SurferOnWww on Mon, 29 Jan 2018 09:22:19


> 現在別件で対応中のため、

ということは、上の私のレスが回答になっているかどうか不明ということと理解していますが、そうであれば「回答としてマーク」は外してください。

#未解決でクローズされることには異論はありません。