[解決済み] User.Identityの利用可能なプロパティを拡張する方法
質問
MVC5 Identity 2.0 を使用して、ユーザーがウェブサイトにログインし、認証の詳細が SQL データベースに保存されるようにしています。Asp.net Identityは、多くのオンラインチュートリアルで見られるような標準的な方法で実装されています。
IdentityModels の ApplicationUser クラスは拡張され、整数の OrganizationId などのカスタムプロパティを含むようになりました。このアイデアは、多くのユーザーを作成し、データベースの関係の目的のために共通の組織に割り当てることができることです。
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
//Extended Properties
public DateTime? BirthDate { get; set; }
public long? OrganizationId { get; set; }
//Key Mappings
[ForeignKey("OrganizationId")]
public virtual Organization Organization { get; set; }
}
コントローラ内で、現在ログインしているユーザーのOrganizationIdプロパティを取得するにはどうしたらよいでしょうか。 それとも、コントローラのメソッドが実行されるたびに、UserIdに基づいてOrganizationIdをデータベースから取得しなければならないのでしょうか?
ウェブでいろいろ読んでみると、ログインしたUserIdなどを取得するために以下を使用する必要があることがわかりました。
using Microsoft.AspNet.Identity;
...
User.Identity.GetUserId();
しかし、OrganizationIdはUser.Identityで利用可能なプロパティではありません。User.Identityを拡張してOrganizationIdプロパティを含める必要がありますか。もしそうなら、どのようにこれを行うか。
私は頻繁にOrganizationIdを必要とする理由は、多くのテーブルクエリは、ログインしているユーザーに関連付けられた組織に関連するデータを取得するOrganizationIdに依存していることです。
どのように解決するには?
上記の質問のように、User.Identityのプロパティを拡張したい場合は、まずApplicationUserクラスに以下のようにプロパティを追加してください。
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
// Your Extended Properties
public long? OrganizationId { get; set; }
}
次に必要なのは、このような拡張メソッドを作成することです(私は新しいExtensionsフォルダに作成します)。
namespace App.Extensions
{
public static class IdentityExtensions
{
public static string GetOrganizationId(this IIdentity identity)
{
var claim = ((ClaimsIdentity)identity).FindFirst("OrganizationId");
// Test for null to avoid issues during local testing
return (claim != null) ? claim.Value : string.Empty;
}
}
}
ApplicationUserクラスでIdentityを作成する際に、Claim -> OrganizationIdをこのように追加するだけです。
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here => this.OrganizationId is a value stored in database against the user
userIdentity.AddClaim(new Claim("OrganizationId", this.OrganizationId.ToString()));
return userIdentity;
}
クレームを追加して拡張メソッドを用意したら、User.Identityのプロパティとして利用できるようにします。 アクセスしたいページやファイルにusingステートメントを追加します。 :
私の場合は
using App.Extensions;
をコントローラ内に、そして
@using. App.Extensions
で、.cshtml View ファイルにあります。
をEDITします。
すべてのViewにusing文を追加しないようにするためにできることは、Viewsフォルダに移動し、そこにあるWeb.configファイルを見つけることです。
ここで
<namespaces>
タグを探し、そこに拡張用の名前空間を追加します。
<add namespace="App.Extensions" />
ファイルを保存して完了です。これで、すべてのViewがあなたの拡張機能を知ることができます。
Extension Methodにアクセスすることができます。
var orgId = User.Identity.GetOrganizationId();
関連
-
[解決済み] コントローラ '...' でパブリックアクションメソッド '...' が見つかりませんでした。
-
[解決済み] 修正方法: ハンドラ "PageHandlerFactory-Integrated" のモジュールリストに "ManagedPipelineHandler" という不正なモジュールが含まれています。
-
[解決済み] MVCにおけるViewModelとは?
-
[解決済み】ASP.NET MVC 3 razor ViewStart ファイルで異なるレイアウトを指定するには?
-
[解決済み】Html.ActionLinkが"?Length=4 "とレンダリングされるのはなぜか?
-
[解決済み】MVC 4 Razor ファイルアップロード
-
[解決済み】ViewModelのベストプラクティス
-
[解決済み] ASP.Net MVC デフォルトの HTTP ヘッダーを削除する方法は?
-
[解決済み] ASP.Net MVCでRequest on Controllerをモック化する方法とは?
-
[解決済み] エリア間のRedirectToAction?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Automapperにタイプマップの設定がない、またはマッピングがサポートされていない - エラー
-
[解決済み] データベースに 'AspNetRoles' という名前のオブジェクトがすでに存在します。
-
[解決済み] Automapper のタイプマップ構成がない、またはサポートされていないマッピング - エラー
-
[解決済み] MVCで、文字列の結果を返すにはどうしたらいいですか?
-
[解決済み] Html.ActionLinkをリンクではなく、ボタンや画像にする
-
[解決済み】ASP.NET RazorのHTML.ActionLinkとUrl.Actionの比較
-
[解決済み】ASP.NET MVC 3 razor ViewStart ファイルで異なるレイアウトを指定するには?
-
[解決済み】MVC 4 Razor ファイルアップロード
-
[解決済み】jQuery Ajaxの呼び出しとHtml.AntiForgeryToken()について)
-
[解決済み] NerdDinnerでASP.NET MVCでModelState.IsValidは何のために有効なのか?