web-dev-qa-db-ja.com

ASPNET IDでセッション管理を行う方法は?

私はAsp.net identity for Login、Register、Forgot Passwordなどを使用しており、ソースコードは以下のリンクから取得されます。

http://www.asp.net/mvc/overview/security/create-an-aspnet-mvc-5-web-app-with-email-confirmation-and-password-reset

http://www.asp.net/identity/overview/features-api/account-confirmation-and-password-recovery-with-aspnet-identity

これで、UserMasterである1つのテーブルがあり、登録時に次のフィールドを要求します:FullName、EmailId、Password、ContactNumber、Gender

My UserMasterには、次のフィールドが含まれています。Id、FullName、EmailId、ContactNumber、Gender

ユーザーが登録フォームを送信すると、このFullName、EmailId、ContactNumber、GenderがserMasterに保存されますEmail、PasswordはAspnetUserに保存されます。

My Register Methodは、上記の2つのリンクで提供されるものと同じです。

ここで、serMasterとAspnetUserの間に関係がないがあることに気付くかもしれません。そのため、ログイン中にユーザーが自分のメールIDを入力してログインすると、このメソッドを使用しますawait SignInManager.PasswordSignInAsyncユーザーを確認し、このメソッドが成功を返す場合は、このメールIDを使用し、UserMasterでこのメールを確認します。一致が見つかる場所で、UserMasterからそのUserIdをフェッチしてセッションに保存し、徹底的に使用します以下のような私のログインメソッドで私のアプリケーション:

 public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
            {
                if (!ModelState.IsValid)
                {
                    return View(model);
                }

                // This doesn't count login failures towards account lockout
                // To enable password failures to trigger account lockout, change to shouldLockout: true
                var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
                switch (result)
                {
                    case SignInStatus.Success:
                  using (var context = new MyEntities())
                        {
                            var fetchUSerId = context.UserMaster.Where(t => t.Email == model.Email).Select(t=>t.UserId).SingleOrDefault();
                            Session["UserId"] = fetchUSerId;
                        }
                        return RedirectToLocal(returnUrl);
                    case SignInStatus.LockedOut:
                        return View("Lockout");
                    case SignInStatus.RequiresVerification:
                        return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
                    case SignInStatus.Failure:
                    default:
                        ModelState.AddModelError("", "Invalid login attempt.");
                        return View(model);
                }
            }

私は私のログイン方法でこれについて話しています:

 case SignInStatus.Success:
                      using (var context = new MyEntities())
                            {
                                var fetchUSerId = context.UserMaster.Where(t => t.Email == model.Email).Select(t=>t.UserId).SingleOrDefault();
                                Session["UserId"] = fetchUSerId;
                            }

これは適切な方法ですか、それともより良い方法ですか?ユーザーIDを保存するだけでなく、ユーザーオブジェクト全体を保存したいと思います。

だから誰でも私にこれをaspnet IDで行う方法を教えてもらえますか?

Asp.Net Identityを使用しているので、セッション関連のものをクレームとして保存する必要があります。これは、カスタマイズされたクレームで拡張するのが非常に簡単です。

余談ですが、詳細な here のように、追加のデータを保持するためにApplicationUserを単純に拡張したほうがよいと思います。

つまり、アプリケーションにカスタムクレームの種類を追加する方法の完全な例を次に示します。

ステップ1-追加情報を保持する1つ以上のカスタムクレームタイプを定義します

public static class CustomClaimTypes
{
    public const string MasterFullName = "http://schemas.xmlsoap.org/ws/2014/03/mystuff/claims/masterfullname";
    public const string MasterUserId = "http://schemas.xmlsoap.org/ws/2014/03/mystuff/claims/masteruserid";
}

クレームタイプは、特定のクレームを識別する一意の文字列です。ここでは、組み込みのクレームタイプと同様の形式を使用しています。

ステップ2-サインインプロセス中に、カスタムクレームタイプの値を設定します

private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
    var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);

    //Fetch data from the UserMaster table 
    var userdata = GetdatafromUserMaster();

    //Using the UserMaster data, set our custom claim types
    identity.AddClaim(new Claim(CustomClaimTypes.MasterUserId, userdata.UserId));
    identity.AddClaim(new Claim(CustomClaimTypes.MasterFullName, userdata.FullName));

    AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
}

注:既存のNameIdentifierクレームとNameクレームを保持するため、カスタムクレームタイプを使用しているため、両方のAsp.Net IdentityandカスタムUserMasterテーブル。

ステップ3-IIdentityに拡張メソッドを追加して、カスタムクレームデータに簡単にアクセスできるようにします

public static class IdentityExtensions
{
    public static string GetMasterUserId(this IIdentity identity)
    {
        if (identity == null)
            return null;

        return (identity as ClaimsIdentity).FirstOrNull(CustomClaimTypes.MasterUserId);
    }

    public static string GetMasterFullName(this IIdentity identity)
    {
        if (identity == null)
            return null;

        return (identity as ClaimsIdentity).FirstOrNull(CustomClaimTypes.MasterFullName);
    }

    internal static string FirstOrNull(this ClaimsIdentity identity, string claimType)
    {
        var val = identity.FindFirst(claimType);

        return val == null ? null : val.Value;
    }
}

ここでは空想はありません。 IIdentityClaimsIdentityとしてキャストし、指定されたCustomClaimTypeの最初のクレームの値、またはnullを返します。クレームが存在しない場合。

ステップ4-これで、ビューやコントローラーのカスタムクレームデータに非常に簡単にアクセスできます。 UserMasterの代わりにApplicationUserテーブルのフルネームを使用したいとしますか?これを行うことができます:

<ul class="nav navbar-nav navbar-right">
    <li>
        @Html.ActionLink("Hello " + User.Identity.GetMasterFullName() + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" })
    </li>
    <li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li>
</ul>

コントローラ内から同じことを行うこともできます。

27
Brendan Green

次のように追加できます。

var listClains=new[] { new Claims(ClainsType.SetiaNumber,Id), new Claims(ClainsType.Name,FullName), new Claims(ClainsType.HomePhone,ContactNumber), new Claims(ClainsType.Gender,Gender)};

var oAuthIdentity=new CalimsIdentity(listClains, otherparameter ...);

詳細については、System.Security.Claims.ClaimTypesを確認できます。

2
JavaScript Linq

あなたはこれを行うことができます:

var fetchUser = context.UserMaster.Where(t => t.Email == model.Email).SingleOrDefault();
if (null == fetchUser)
    throw new Exception("Not found");
Session["User"] = fetchUser;
1
C.Fasolin