Aspnet_Users.UserIDに関連するuniqueidentifier UserIDを持つテーブルがいくつかあります。ユーザーがこれらのテーブルのデータを送信すると、コントローラーメソッドには[Authorize]があるため、Userオブジェクトを取得します。 User.Identity.Nameでユーザー名を取得できますが、UserIDを取得して(所有権)関係を確立するにはどうすればよいですか?
Userオブジェクトからは取得できないようですが、次の方法で取得できます。
Guid userGuid = (Guid)Membership.GetUser().ProviderUserKey;
解決策は次のとおりです。
含める:
using Microsoft.AspNet.Identity;
次に、拡張メソッドを使用します。
User.Identity.GetUserId();
まず、この回答は厳密にはMVCの回答ではなく、ASP.NETの回答です。あなたのサイトがMVCであるという事実は、この場合、問題の解決とは無関係です。
うーんシステムでユーザーをどのように処理しているかはよくわかりませんが、(非常に悪い)asp.net membership provider
は.netですぐに使用できます。これは、あなたが言ったという事実によって示唆されています
デフォルトの 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
User.Identity
はIPrincipal
です-通常は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による回答を参照してください)
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);
シンプル...
int userID = WebSecurity.CurrentUserId;
ProviderUserKeyプロパティ。
System.Web.Security.MembershipUser u;
u.ProviderUserKey
通常、使用できるのはWebSecurity.currentUserId
、ただし、アカウントが作成された直後にAccountControllerにいて、ユーザーIDを使用してユーザーを他のテーブルのデータにリンクする場合は、WebSecurity.currentUserId
(および上記のすべてのソリューション)、残念ながら、その場合は-1を返すため、機能しません。
幸いなことに、この場合、UserProfilesテーブルのdbコンテキストが手元にあるので、次の方法でユーザーIDを取得できます。
UserProfile profile = db.UserProfiles.Where(
u => u.UserName.Equals(model.UserName)
).SingleOrDefault();
最近このケースに出くわしましたが、この答えは時間を大幅に節約してくれたので、そこに置いておくだけです。