2016-07-23 19 views
12

現在ログインしているユーザーのIDを取得する方法については、さまざまなRCのASP.NETコアでさまざまな回答が寄せられています。ここで明確な質問をしたかったのです。Entity Frameworkコアで現在のユーザーIDを取得する適切な方法

using Microsoft.AspNet.Identity; 
using System.Security.Claims; 

User.GetUserId(); 

しかし、新しくリリースされたバージョンと:「1.0.0」

をRC1では、あなたはこのような何かを行うことができます:それproject.jsonは今「Microsoft.AspNetCore.Identity.EntityFrameworkCore」がありますのでご注意くださいEF Coreの1、Microsoft.AspNet.Identityは正しいバージョンではありません。

ちょうど現在ログインしているユーザーを取得するためにたくさんのように思えるのUserManagerを使用する提案がありました:

private Task<ApplicationUser> GetCurrentUserAsync() => _userManager.GetUserAsync(HttpContext.User); 

var user = await GetCurrentUserAsync(); 
var userId = user?.Id; 

私が見つけたもう一つの方法:

private readonly UserManager<ApplicationUser> _userManager; 
_userManager.GetUserId(User) 

だから、ASPとは。 NET Core 1 RTMとEF Core 1をproject.jsonの以下のライブラリと組み合わせて、現在ログインしているユーザのIDを取得する適切な方法は何ですか?あなたは、データベースへのラウンドトリップを作っているようあなたは、ユーザーのIDを取得するためにのUserManagerを使用して、コントローラをwithingからこれをアクセスしている場合

"Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0", 
"Microsoft.AspNetCore.Mvc": "1.0.0", 
+0

質問タイトルにタグを入れないでください! http://stackoverflow.com/help/tagging – Tseng

答えて

11

ASP.NETコアアイデンティティはstartup.csにDIを介して注入された - などのあなただけの

UserManager<ApplicationUser> userManager 

あなたはその後、メソッドに次のように使用することができますコンストラクタを介してのUserManagerを注入する必要が

_userManager.GetUserId(User); 

これは、個別のユーザーアカウントで新しいASP.NETコア1プロジェクトを作成するときにサンプルWebアプリケーションで使用される方法です。

16

はかなり非効率的です。あなたはClaimsIdentityを使用している場合は、ユーザーIDを取得するには、このような何かを行うことができます。

var claimsIdentity = (ClaimsIdentity)this.User.Identity; 
var claim = claimsIdentity.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier); 
var userId = claim.Value; 

この方法だけで順番に自動的に非直列化して保存され、既にクッキーに存在しているユーザーIDを読み込み、 ClaimsIdentityインスタンス。

私はこのヘルパークラスを使用します。

public static class UserHelpers 
{ 
    public static string GetUserId(this IPrincipal principal) 
    { 
     var claimsIdentity = (ClaimsIdentity)principal.Identity; 
     var claim = claimsIdentity.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier); 
     return claim.Value; 
    } 
} 

したがって、ユーザーのIDを取得すると、次のようになります。

var userId = this.User.GetUserId(); 

何らかの理由により、必要な請求がクレーム collecitonに存在しない、場合は、ユーザーを作成するときに簡単に追加することができます申し立て内容

+0

驚いたことに、現在ログインしているユーザーIDを取得する組み込みの方法はありません。このメソッドは、古いUsers.Identity.GetUserId()がどのように動作するか、または動作する方法とは異なりますか? – Reza

+0

このメソッドは、古いGetUserIdと同じ基本ロジックを使用します。違いは、User.Idenityオブジェクトの代わりにUserオブジェクトで直接呼び出すことができる点です。比較のためにこの答えをチェックしてください。http://stackoverflow.com/a/28520274/1396972彼らがそれを削除した理由は、LSPの違反であるClaimsIdentityへのキャストのためだと私は信じています。 –

+0

フレームワーク4.5.2のasp.netコアアプリケーションに使用します。ナゲットパッケージMicrosoft.AspNet.Identityを追加すると、あいまいさや既存のフレームワーク参照との競合が発生しました。 –

2

以下の1行は、上記の他の回答のより簡潔なバージョンです。

var user = User.FindFirst(ClaimTypes.NameIdentifier).Value; 

さらに少し説明するために、私はので、私はこの1つ選択したデータベース内の任意のテーブルなしの認証の最も基本的なフォームを使用していた - コアのドキュメントから Using Cookie Authentication without ASP.NET Core Identityを。

この作業を取得するには、最初のステップは、最も簡単なクレームベースの認証を有効なユーザーIDとパスワードを入力したバックポストにAccountControllerに続いてStartup.cs

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) 
    .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => 
     { 
     options.LoginPath = new PathString("/Account/Login/"); 
     options.LogoutPath = new PathString("/Account/Logoff/"); 
     options.AccessDeniedPath = new PathString("/Account/AccessDenied/"); 
     options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest; 
     }); 

services.ConfigureApplicationCookie(identityOptionsCookies => 
{ 
    // See https://andrewlock.net/automatically-validating-anti-forgery-tokens-in-asp-net-core-with-the-autovalidateantiforgerytokenattribute/ 
    identityOptionsCookies.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest; 
}); 

でサービスを追加することですクレームとしてログインIDを追加するだけです。

VAR請求=新しいリスト {新しい項(ClaimTypes.NameIdentifier、loginViewModel.Guid、ClaimValueTypes.String、発行者)、 }。

  var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); 

      var principal = new ClaimsPrincipal(claimsIdentity); 

      await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal, 
       new AuthenticationProperties 
       { 
        ExpiresUtc = DateTime.UtcNow.AddMinutes(_cookieTimeoutInMinutes), 
        IsPersistent = true, 
        AllowRefresh = false 
       }); 

サインインが完了したら、上記の1つのライナーの説明に従ってユーザーIDを取得できます。より詳細な手順については、上記のMilos Mrdovicの回答を参照してください。

var user = User.FindFirst(ClaimTypes.NameIdentifier).Value; 

詳細については、Claims-Based Authorizationを参照してください。

+0

完了@PetterFriberg :)。 –

関連する問題