73

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

4

11 に答える 11

87

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

Guid userGuid = (Guid)Membership.GetUser().ProviderUserKey;
于 2009-05-29T19:58:07.093 に答える
27

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


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

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

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

これから、ユーザーの 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

于 2009-05-29T12:36:28.203 に答える
18

User.IdentityIPrincipal- 通常タイプのSystem.Web.Security.FormsIdentity

UserID については何も知りません。「ID」の概念を抽象化したものにすぎません。

IIdentityインターフェイスには、ユーザーの「名前」しかなく、「ユーザー名」さえありません。

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

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

( WebMatrixWebSecurityの nuget パッケージの場所Microsoft.AspNet.WebPages.WebData

使用することもできます

WebSecurity.CurrentUserName
WebSecurity.CurrentUserId

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

于 2013-01-17T03:08:00.190 に答える
11

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;
  }
}
于 2009-05-29T20:08:04.887 に答える
6

ユーザー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();

}
于 2014-01-09T02:39:30.387 に答える
3

独自のIPrincipalオブジェクトを認証に使用している場合は、IDにアクセスするためにそれをキャストする必要があります。

例えば:

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

    //...Other IPrincipal stuff
}

これは、独自のフォームベースの認証を作成するための優れたチュートリアルです。

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

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

于 2009-05-29T14:39:01.153 に答える
2
using System.Web.Security;

MembershipUser user = Membership.GetUser(User.Identity.Name); 
int id = Convert.ToInt32(user.ProviderUserKey);
于 2014-02-27T18:08:26.670 に答える
1

ProviderUserKey プロパティです。

System.Web.Security.MembershipUser u;
u.ProviderUserKey
于 2009-05-29T07:17:26.180 に答える
1

単純....

int userID = WebSecurity.CurrentUserId;
于 2013-08-05T09:54:05.607 に答える
0

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

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

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

私は最近このケースに出くわしました.

于 2015-12-15T10:55:25.930 に答える