ASP.NET (OWIN) ID: Web API コントローラーからユーザー ID を取得するにはどうすればよいでしょうか? 質問する

ASP.NET (OWIN) ID: Web API コントローラーからユーザー ID を取得するにはどうすればよいでしょうか? 質問する

(VS2013 RTW、ASP.NET MVC5 を使用)

ASP.NET ID を使用するときに、ApplicationUser クラス (およびテーブル) にプロパティを追加する方法については、多くのドキュメントを見てきました。しかし、外部キーを介して ApplicationUser テーブルにマップされるコンテンツを含む別のテーブルを作成する方法については、ドキュメントを見たことはありません。

独自の Microsoft.AspNet.Identity.EntityFramework.IdentityDbContext を正常に派生し、独自の "UserPreferences" テーブルが SQL Server データベース内のさまざまな "AspNet*" テーブルと調和して共存するようになりました。ただし、現在のユーザーの ID を取得して "UserPreferences" テーブルに新しい行を書き込む最適な方法がわかりません。プロジェクトは ASP.NET MVC ですが、Web API コントローラーを追加し (その中で作業しています) ていることに注意してください。

実用的な解決策があります。

            var uman = new Microsoft.AspNet.Identity.UserManager<Microsoft.AspNet.Identity.EntityFramework.IdentityUser>(new Microsoft.AspNet.Identity.EntityFramework.UserStore<Microsoft.AspNet.Identity.EntityFramework.IdentityUser>(new App1.Data.App1DbContext()));

            var uident = User.Identity;

            var userobject = uman.FindByNameAsync(uident.Name);

            var userid = userobject.Result.Id;
            // (Perform new row creation including the userid we just looked up

AspNetUsers テーブル (Identity フレームワークによって定義) は次のフィールドで構成されているとします。

-id (PK, nvarchar(128) - seems to contain a GUID, not sure why not an autoincrement integer, but I assume there are reasons for this)
-Username (nvarchar(max))
-PasswordHash (nvarchar(max))
-SecurityStamp (nvarchar(max))

このテーブルで参照する正しいフィールドは、ID フィールド (ユーザー名ではありません) だと思います。(ユーザーがユーザー名を変更し、他のユーザーがそのユーザーのユーザー名を推測する可能性があるため、両方のフィールドが存在すると考えられます。) そのため、現在のユーザーの ID を取得して "UserPreferences" テーブルに保存する必要があります。これが上記のコードで行っていることです。しかし、この検索を行うのは非効率的であるように思われます。

重要な点は、System.Web.Mvc.Controller のコンテキストでは次の操作を実行できることです。

User.Identity.GetUserId()
(Runtime type of User.Identity: System.Security.Principal.GenericIdentity)

しかし、System.Web.Http.ApiController (Web API) のコンテキストでは、そのメソッドが存在しないため (User.Identity のランタイム タイプ: System.Security.Claims.ClaimsIdentity)、代わりに次のメソッドに依存する必要があります。

User.Identity.Name

名前を ID に変換するための追加の検索を実行します。これを改善する方法について何か提案はありますか? ユーザー データを別のテーブルに書き込むタスクに正しい方法で取り組んでいますか?

ベストアンサー1

同じ拡張メソッドを使用して、MVCコントローラーとWeb APIコントローラーの両方でユーザーIDを取得できるはずです。アイデンティティ 1.0 RTW パッケージ

以下は、アイデンティティ パッケージからの拡張機能です。

namespace Microsoft.AspNet.Identity
{
    public static class IdentityExtensions
    {
        public static string FindFirstValue(this ClaimsIdentity identity, string claimType);
        public static string GetUserId(this IIdentity identity);
        public static string GetUserName(this IIdentity identity);
    }
}

IIdentity は、すべての ID タイプの基本インターフェイスです。拡張メソッドを表示するには、「using Microsoft.AspNet.Identity」を追加する必要がある場合があります。

ところで、ユーザー用の外部テーブルを追加する場合、ApplicationUser を使用して、UserPreference にナビゲーション プロパティを追加し、EF でそれらの関係を処理できるようにしてみてはいかがでしょうか。その方が簡単になります。

おすすめ記事