web-dev-qa-db-ja.com

Asp.Net MVC 5でログインしているユーザーのユーザーIDを取得する

私はASP.Net MVCが比較的新しいので、組み込みのユーザーログイン機能を今すぐ使用しようとしています。登録ビューでユーザーを登録できます。作成したユーザーでログインしようとすると、これも機能します。マスターページにリダイレクトされます。

しかし、現在のユーザーのUserIDを取得することはできません。 HomeControllerとAccountControllerでコードを試しましたが、両方とも機能しませんでした。最初の行のステートメントは常にnullを返します。

var userID = User.Identity.GetUserId();

if (!string.IsNullOrEmpty(userID))
{
    var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(ApplicationDbContext.Create()));
    var currentUser = manager.FindById(User.Identity.GetUserId());
}

UserIDを取得する前に、他に何かする必要がありますか?

40
Philipp Eger

答えはコードの中にあります。これは何を返しますか?

var userID = User.Identity.GetUserId();

ASP.NET Identityを使用している場合、afterログイン(および別のページへのリダイレクト)の場合、IPrincipal.IIdentityClaimsIdentityになります。これを試すことができます:

var claimsIdentity = User.Identity as ClaimsIdentity;
if (claimsIdentity != null)
{
    // the principal identity is a claims identity.
    // now we need to find the NameIdentifier claim
    var userIdClaim = claimsIdentity.Claims
        .FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier);

    if (userIdClaim != null)
    {
        var userIdValue = userIdClaim.Value;
    }
}

上記のコードブロックは正確ではありませんが、本質的にはIIdentity.GetUserId拡張メソッドが行うことです。

これらのいずれも機能しない場合、ユーザーはまだ実際にサイトにログインしていない可能性があります。ログイン後、サーバーが認証Cookieをブラウザーに書き込む前に、別のページにリダイレクトする必要があります。このCookieは、User.Identityがこの要求情報(NameIdentifierを含む)をすべて保持する前に書き込まれる必要があります以降の要求

54
danludwig