aspnet_Users.UserID に関連する uniqueidentifier UserID を持つテーブルがいくつかあります。ユーザーがこれらのテーブルのデータを送信すると、コントローラー メソッドに [Authorize] があるため、ユーザー オブジェクトが取得されます。User.Identity.Name でユーザー名を取得できますが、(所有権) 関係を確立できるように UserID を取得するにはどうすればよいですか?
11 に答える
Userオブジェクトからは取得できないようですが、次の方法で取得できます。
Guid userGuid = (Guid)Membership.GetUser().ProviderUserKey;
まず、この回答は厳密には 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
User.Identity
はIPrincipal
- 通常タイプの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 による回答を参照してください)
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;
}
}
ユーザー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();
}
独自のIPrincipalオブジェクトを認証に使用している場合は、IDにアクセスするためにそれをキャストする必要があります。
例えば:
public class MyCustomUser : IPrincipal
{
public int UserId {get;set;}
//...Other IPrincipal stuff
}
これは、独自のフォームベースの認証を作成するための優れたチュートリアルです。
http://www.codeproject.com/KB/web-security/AspNetCustomAuth.aspx
これにより、ユーザーの認証Cookieを作成し、カスタムユーザーデータにアクセスするための正しいパスが得られるはずです。
using System.Web.Security;
MembershipUser user = Membership.GetUser(User.Identity.Name);
int id = Convert.ToInt32(user.ProviderUserKey);
ProviderUserKey プロパティです。
System.Web.Security.MembershipUser u;
u.ProviderUserKey
単純....
int userID = WebSecurity.CurrentUserId;
通常はそのまま使用できますがWebSecurity.currentUserId
、アカウントが作成された直後に AccountController にいて、ユーザー ID を使用してユーザーを他のテーブルのデータにリンクしたい場合WebSecurity.currentUserId
(および上記のすべてのソリューション)、残念ながら、その場合は -1 を返すため、機能しません。
幸いなことに、この場合、UserProfiles テーブルの db コンテキストが手元にあるので、次の方法でユーザー ID を取得できます。
UserProfile profile = db.UserProfiles.Where(
u => u.UserName.Equals(model.UserName)
).SingleOrDefault();
私は最近このケースに出くわしました.