私は以前MVC5でUser.Identity.GetUserId()
を使ってこれを行いましたが、それはここではうまくいかないようです。 User.Identity
はGetUserId()
メソッドを持っていません
私はMicrosoft.AspNet.Identity
を使っています
System.Security.Claimsを使用して含めたので、GetUserId()拡張メソッドにアクセスできました。
注意:私はすでにMicrosoft.AspNet.Identityを使用していましたが、拡張メソッドを取得できませんでした。だから私はそれらの両方がお互いに関連して使用されなければならないと思います
using Microsoft.AspNet.Identity;
using System.Security.Claims;
EDIT:この答えは古くなっています。 CORE 1.0でこれを達成するための時代遅れの方法についてのSorenまたはAdrienの答えを見てください。
ASP.NET Core 1.0RC1まで:
それは System.Security.Claims namespaceからのUser.GetUserId()です。
ASP.NET Core 1.0以降RC2:
あなたは今 UserManager を使わなければなりません。現在のユーザーを取得するためのメソッドを作成できます。
private Task<ApplicationUser> GetCurrentUserAsync() => _userManager.GetUserAsync(HttpContext.User);
そしてオブジェクトを使ってユーザー情報を取得します。
var user = await GetCurrentUserAsync();
var userId = user?.Id;
string mail = user?.Email;
注: このstring mail = (await _userManager.GetUserAsync(HttpContext.User))?.Email
のように単一行を書く方法を使わなくても実行できますが、単一の責任は尊重されません。原理。いつかIdentity以外のソリューションを使用するなど、いつかユーザー管理システムを変更することにした場合は、コード全体を見直す必要があるため、ユーザーを取得する方法を切り分けることをお勧めします。
あなたはそれをあなたのコントローラーに入れることができます:
var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
または以前のような拡張方法を書く。Corev1.0
using System;
using System.Security.Claims;
namespace Shared.Web.MvcExtensions
{
public static class ClaimsPrincipalExtensions
{
public static string GetUserId(this ClaimsPrincipal principal)
{
if (principal == null)
throw new ArgumentNullException(nameof(principal));
return principal.FindFirst(ClaimTypes.NameIdentifier)?.Value;
}
}
}
そして、ユーザーのClaimsPrincipalが利用可能な場所に移動します。
using Microsoft.AspNetCore.Mvc;
using Shared.Web.MvcExtensions;
namespace Web.Site.Controllers
{
public class HomeController : Controller
{
public IActionResult Index()
{
return Content(this.User.GetUserId());
}
}
}
コントローラー内:
public class YourControllerNameController : Controller
{
public IActionResult YourMethodName()
{
var userId = User.FindFirst(ClaimTypes.NameIdentifier).Value // will give the user's userId
var userName = User.FindFirst(ClaimTypes.Name).Value // will give the user's userName
var userEmail = User.FindFirst(ClaimTypes.Email).Value // will give the user's Email
}
}
他のクラスでは
public class OtherClass
{
private readonly IHttpContextAccessor _httpContextAccessor;
public OtherClass(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void YourMethodName()
{
var userId = _httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
// or
var userId = _httpContextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
}
}
次に、IHttpContextAccessor
をStartup
クラスに次のように登録します。
public void ConfigureServices(IServiceCollection services)
{
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
// Or you can also register as follows
services.AddHttpContextAccessor();
}
.NET Core 2.0の場合のみController
クラスでログインしているユーザーのユーザーIDを取得するには、以下が必要です。
var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
または
var userId = HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
例えば.
contact.OwnerID = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
この記事のどこかで述べたように、GetUserId()メソッドはUserManagerに移動されました。
private readonly UserManager<ApplicationUser> _userManager;
public YourController(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
public IActionResult MyAction()
{
var userId = _userManager.GetUserId(HttpContext.User);
var model = GetSomeModelByUserId(userId);
return View(model);
}
空のプロジェクトを開始した場合は、startup.csのサービスにUserMangerを追加する必要があります。そうでなければ、これはすでに当てはまるはずです。
エイドリアンの答えは正しいですが、あなたはこれをすべて一行で行うことができます。追加機能や混乱の必要はありません。
ASP.NET Core 1.0で確認しました
var user = await _userManager.GetUserAsync(HttpContext.User);
それからuser.Email
のような変数の他のプロパティを取得できます。これが誰かに役立つことを願っています。
ASP.NET Core 2.0、Entity Framework Core 2.0、AspNetCore.Identity 2.0 API( https://github.com/kkagill/ContosoUniversity-Backend ) :
Id
はUser.Identity.Name
に変更されました
[Authorize, HttpGet("Profile")]
public async Task<IActionResult> GetProfile()
{
var user = await _userManager.FindByIdAsync(User.Identity.Name);
return Json(new
{
IsAuthenticated = User.Identity.IsAuthenticated,
Id = User.Identity.Name,
Name = $"{user.FirstName} {user.LastName}",
Type = User.Identity.AuthenticationType,
});
}
応答:
microsoft.AspNetCore.Identity&System.Security.Claimsをインポートする必要があります
// to get current user ID
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
// to get current user info
var user = await _userManager.FindByIdAsync(userId);
APiController
内
User.FindFirst(ClaimTypes.NameIdentifier).Value
このようなものはあなたが主張を得るでしょう
User.Identity.GetUserId();
asp.netアイデンティティコア2.0には存在しません。この点で、私は別の方法で管理しました。ユーザー情報を取得するため、アプリケーション全体を使用するための共通クラスを作成しました。
共通クラスPCommonとインターフェースIPCommonを作成し、参照を追加しますusing System.Security.Claims
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
namespace Common.Web.Helper
{
public class PCommon: IPCommon
{
private readonly IHttpContextAccessor _context;
public PayraCommon(IHttpContextAccessor context)
{
_context = context;
}
public int GetUserId()
{
return Convert.ToInt16(_context.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier));
}
public string GetUserName()
{
return _context.HttpContext.User.Identity.Name;
}
}
public interface IPCommon
{
int GetUserId();
string GetUserName();
}
}
ここで共通クラスの実装
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.Extensions.Logging;
using Pay.DataManager.Concreate;
using Pay.DataManager.Helper;
using Pay.DataManager.Models;
using Pay.Web.Helper;
using Pay.Web.Models.GeneralViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Pay.Controllers
{
[Authorize]
public class BankController : Controller
{
private readonly IUnitOfWork _unitOfWork;
private readonly ILogger _logger;
private readonly IPCommon _iPCommon;
public BankController(IUnitOfWork unitOfWork, IPCommon IPCommon, ILogger logger = null)
{
_unitOfWork = unitOfWork;
_iPCommon = IPCommon;
if (logger != null) { _logger = logger; }
}
public ActionResult Create()
{
BankViewModel _bank = new BankViewModel();
CountryLoad(_bank);
return View();
}
[HttpPost, ActionName("Create")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Insert(BankViewModel bankVM)
{
if (!ModelState.IsValid)
{
CountryLoad(bankVM);
//TempData["show-message"] = Notification.Show(CommonMessage.RequiredFieldError("bank"), "Warning", type: ToastType.Warning);
return View(bankVM);
}
try
{
bankVM.EntryBy = _iPCommon.GetUserId();
var userName = _iPCommon.GetUserName()();
//_unitOfWork.BankRepo.Add(ModelAdapter.ModelMap(new Bank(), bankVM));
//_unitOfWork.Save();
// TempData["show-message"] = Notification.Show(CommonMessage.SaveMessage(), "Success", type: ToastType.Success);
}
catch (Exception ex)
{
// TempData["show-message"] = Notification.Show(CommonMessage.SaveErrorMessage("bank"), "Error", type: ToastType.Error);
}
return RedirectToAction(nameof(Index));
}
}
}
挿入アクションでuserIdと名前を取得します。
_iPCommon.GetUserId();
ありがとう、Maksud
使用できます
string userid = User.FindFirst("id").Value;
何らかの理由でNameIdentifierがユーザ名を取得するようになりました(.net core 2.2)