2015-10-01 11 views
8

私はログイン、登録のためのAsp.netのアイデンティティを使用しています、パスワードなどを忘れ、ソースコードは、リンクの下に、このから取られる:aspnet IDでセッション管理を行うには?

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台を持っているし、登録時に私はこの次のフィールドを求めています: フルネーム、EMAILID、パスワード、ContactNumber、性別

私UserMasterは、この次のフィールドが含まれています:ID、フルネーム、EMAILID、ContactNumber、性別今、ユーザーは登録がこのフルネームは、EMAILID、ContactNumberは、性別が一緒にUserMasterに保存されます形成提出するとき

電子メール、パスワードはAspnetUserに保存されます。

私の登録方法は上記の2つのリンクと同じです。

ここでは、ユーザーは、この方法が成功を返した場合、私は私、ユーザーを検証するために、このメソッドawait SignInManager.PasswordSignInAsyncを使用しますログインする彼の電子メールIDを入力しますときに私UserMasterとAspnetUser間何の関係がログイン時にそれほど存在しないことに気づくかもしれませんこの電子メール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でこれを行う方法を教えてもいいですか?

+0

を確認することができます詳細については

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 ...); 

?あなたはそれを騙してそれをすべてカスタムにしても、まだフレームワークを活用することができますか? (私は完全にあなたのコードで何かが不足しているかもしれない)...この記事からの答えを確認してください:http://stackoverflow.com/questions/1064271/asp-net-mvc-set-custom-iidentity-or-iprincipal –

+1

AspNet IDが使用するClaimsIdentityにこれらの値をすべて格納する方がよいでしょう。これはかなり標準的なものです。 –

+1

http://stackoverflow.com/questions/31974228/can-you-extend-httpcontext-current-user-identity-properties/31976327#31976327 –

答えて

20

、あなたは、特許請求の範囲としてセッション関連のものを保存したいです。これはカスタマイズされた主張で拡張するのが非常に簡単です。

脇に、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); 
} 

注:私たちは、既存のNameIdentifierName主張を維持するように、カスタムの要求の種類を使用して、することができていますしたがって、Asp.Net Identity のカスタムUserMasterテーブルの両方から簡単にID情報にアクセスできます。

ステップ3 - ここに空想何

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; 
    } 
} 

ので、我々は簡単に私たちのカスタム要求のデータにアクセスすることができIIdentityに拡張メソッド(複数可)を追加しません。 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> 

コントローラ内でも同じことができます。

+0

おかげでdefinetelyこれを試してみて、あなたは再び私のためにあなたの貴重な時間を温存し、これの真っ只中に、このソリューション –

+0

@Brendanグリーンを掲示するためにあなたをとても感謝know.Onceできるようになるコメントを参照してくださいそれはそうそのコード・セッション[「ユーザーID」]のこのライン= fetchUSerId。もう必要ないと思われる。 bcoz Owinはこれを内部的にしていますか?私はOwinが偶然にセッションを創り出すのですか?ここで私を案内してください。 – User

+0

@Brendan、私は同じことを使用していますが、エラー「ユーザIDがnullである」あなたはあなたの問題、あなたが使用しているコードの詳細は、新しい質問をおそらく最高 –

1

あなたはこれを行うことがあります。あなたはAsp.Netアイデンティティを使用しているので

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

これはすでに私のコードで行っています。私のコードを正しく見てください。私は自分のコードに投稿したものの代わりとなる良い解決策を求めています –

+0

申し訳ありませんが、私のソリューションにuserIdフィールドのみを保存します。ユーザオブジェクト。 –

+0

は、Brenden緑がたくさんあなたのans.Iため –

2

あなたはとして追加することができます:あなたは組み込みのフォーム認証を好きではないSystem.Secutity.Claims.ClaimTypes