web-dev-qa-db-ja.com

ASP.Net MVCでユーザーオブジェクトのユーザーIDを取得するにはどうすればよいですか?

Aspnet_Users.UserIDに関連するuniqueidentifier UserIDを持つテーブルがいくつかあります。ユーザーがこれらのテーブルのデータを送信すると、コントローラーメソッドには[Authorize]があるため、Userオブジェクトを取得します。 User.Identity.Nameでユーザー名を取得できますが、UserIDを取得して(所有権)関係を確立するにはどうすればよいですか?

72
pupeno

Userオブジェクトからは取得できないようですが、次の方法で取得できます。

Guid userGuid = (Guid)Membership.GetUser().ProviderUserKey;
86
pupeno

解決策は次のとおりです。

含める:

using Microsoft.AspNet.Identity;

次に、拡張メソッドを使用します。

User.Identity.GetUserId();
30
faisale

まず、この回答は厳密にはMVCの回答ではなく、ASP.NETの回答です。あなたのサイトがMVCであるという事実は、この場合、問題の解決とは無関係です。


うーんシステムでユーザーをどのように処理しているかはよくわかりませんが、(非常に悪い)asp.net membership providerは.netですぐに使用できます。これは、あなたが言ったという事実によって示唆されています

  • aspnet_Users.UserID
  • UserIDは一意の識別子です(読み取り:GUID)。

デフォルトの FormsIdentity を使用するデフォルトのフォーム認証システムでは、 Name と呼ばれる単一のプロパティのみがあります(正しく記述されています)。つまり、一意のユーザー情報を配置する値は1つだけです。あなたの場合、NameプロパティにName/UserName/DisplayNameを入れています。この名前は表示名であり、一意であると想定しています。ここに入力する値が何であれ、それは一意でなければなりません

これから、ユーザーのGUIDを取得できます。

これをチェックしてください。

using System.Web.Security;

....

// NOTE: This is a static method .. which makes things easier to use.
MembershipUser user = Membership.GetUser(User.Identity.Name);
if (user == null)
{
    throw new InvalidOperationException("User [" + 
        User.Identity.Name + " ] not found.");
}

// Do whatever u want with the unique identifier.
Guid guid = (Guid)user.ProviderUserKey;

そのため、ユーザー情報を取得するたびに、上記の静的メソッドを使用してデータベースから取得する必要があります。

MSDNで Membershipクラス および MembershipUserクラス のすべてをお読みください。

ボーナスアンサー/提案

そのため、その結果をキャッシュするので、データベースにアクセスし続ける必要はありません。

... cont from above....
Guid guid = (Guid)user.ProviderUserKey;

Cache.Add(User.Identity.Name, user.UserID); // Key: Username; Value: Guid.

それ以外の場合は、独自のIdentityクラス( IIdentity から継承)を作成し、UserIDなどの独自のカスタムプロパティを追加できます。その後、認証するたびに(また、すべての要求で)この値を設定できます。とにかく、これはハードコアソリューションであるため、今はキャッシュを使用します。

HTH

27
Pure.Krome

User.IdentityIPrincipalです-通常はSystem.Web.Security.FormsIdentity

UserIDについては何も知りません。これは単に「アイデンティティ」の概念を抽象化したものです。

IIdentity インターフェースには、ユーザーの「名前」のみが含まれ、「ユーザー名」は含まれません。

デフォルトの SimpleMembershipProvider でMVC4を使用している場合、これを行うことができます。

WebSecurity.GetUserId(User.Identity.Name)   // User is on ControllerBase

WebSecurityはnugetパッケージMicrosoft.AspNet.WebPages.WebData WebMatrixで

使用することもできます

WebSecurity.CurrentUserName
WebSecurity.CurrentUserId

ASPNetMembershipProvider を使用している場合、これはより複雑なASPNETメンバーシップシステムであり、@ eduncan911による回答を参照してください)

18
Simon_Weaver

ASP.NETメンバーシップを使用している場合(IPrincipalオブジェクトを使用する場合):

using System.Web.Security;
{
  MembershipUser user = Membership.GetUser(HttpContext.User.Identity.Name);
  Guid guid = (Guid)user.ProviderUserKey;
}

User.Identityは常に、ログインしているかどうかにかかわらず、現在のユーザーの状態を返します。

匿名かどうかなど。したがって、次のチェックがログインします。

if (User.Identity.IsAuthenticated)
{
  ...
}

それで、すべてをまとめる:

using System.Web.Security;
{
  if (User.Identity.IsAuthenticated)
  {
    MembershipUser user = Membership.GetUser(HttpContext.User.Identity.Name);
    Guid guid = (Guid)user.ProviderUserKey;
  }
}
11
eduncan911

ユーザーIDを取得する最適なオプション

以下の参照を追加

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Owin.Security;*

public myFunc()
{
   .....
   // Code which will give you user ID is 
   var tmp = User.Identity.GetUserId();

}
6
user3175805

承認に独自のIPrincipalオブジェクトを使用している場合は、IDにアクセスするためにキャストするだけです。

例えば:

public class MyCustomUser : IPrincipal
{
    public int UserId {get;set;}

    //...Other IPrincipal stuff
}

独自のフォームベース認証の作成に関する優れたチュートリアルを次に示します。

http://www.codeproject.com/KB/web-security/AspNetCustomAuth.aspx

これにより、ユーザーの認証Cookieを作成し、カスタムユーザーデータにアクセスするための正しいパスが得られます。

3
ebrown
using System.Web.Security;

MembershipUser user = Membership.GetUser(User.Identity.Name); 
int id = Convert.ToInt32(user.ProviderUserKey);
2
user3361768

シンプル...

int userID = WebSecurity.CurrentUserId;
1
Izztraab

ProviderUserKeyプロパティ。

System.Web.Security.MembershipUser u;
u.ProviderUserKey
1
Alex

通常、使用できるのはWebSecurity.currentUserId、ただし、アカウントが作成された直後にAccountControllerにいて、ユーザーIDを使用してユーザーを他のテーブルのデータにリンクする場合は、WebSecurity.currentUserId(および上記のすべてのソリューション)、残念ながら、その場合は-1を返すため、機能しません。

幸いなことに、この場合、UserProfilesテーブルのdbコンテキストが手元にあるので、次の方法でユーザーIDを取得できます。

UserProfile profile = db.UserProfiles.Where(
    u => u.UserName.Equals(model.UserName)
).SingleOrDefault();

最近このケースに出くわしましたが、この答えは時間を大幅に節約してくれたので、そこに置いておくだけです。

0
www.debug.coach