2017-08-22 4 views
0

ログインはかなり標準のアイデンティティコードです。私は私が必要なものを行うにはいくつかのことを追加しましたが、大部分はログインコードは、未編集のまま:ASP.NETユーザーの役割が確立される前にログイン後にIDがリダイレクトされる

var result = signinManager.PasswordSignIn(User.UserName, Password.Text, RememberMe.Checked, shouldLockout: false); 

switch (result) 
{ 
    case SignInStatus.Success: 
     // Store the user's supplier Id (if it exists - i.e. user is not an admin). 
     using (ApplicationDbContext Context = new ApplicationDbContext()) 
     { 
      Session["UserId"] = User.Id; 
     } 

     IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response); 
     break; 
} 

、私は彼の役割に応じて、ここまたはそこにユーザーを取るためにIdentityHelperにリダイレクトを修正:

public static void RedirectToReturnUrl(string returnUrl, HttpResponse response) 
{ 
    if (!String.IsNullOrEmpty(returnUrl) && IsLocalUrl(returnUrl)) 
    { 
     response.Redirect(returnUrl); 
    } 
    else 
    { 
     if (HttpContext.Current.User.IsInRole("Supplier")) 
      response.Redirect("~/Members/Supplier.aspx"); 

     if (HttpContext.Current.User.IsInRole("Admin")) 
      response.Redirect("~/Members/Admin.aspx"); 

     if (HttpContext.Current.User.IsInRole("Consultant")) 
      response.Redirect("~/Members/Consultant.aspx"); 
    } 
} 

問題は、新しいユーザーで初めてログインしたとき(つまり、管理者としてログアウトし、ログアウトしてサプライヤとしてログインしようとしたとき)、HttpContext.Current.User.IsInRole("Supplier")がfalseを返すため、ログインはリダイレクトされません。

私はすぐにシステムがあまりにも早くリダイレ​​クトを試みているとログインが実際に適切にユーザー情報をコンパイルしていないように私には思えるので、それは完全に正常に動作し、同じログイン資格情報を使用して再度お試しください。

このような場合、どのようなユーザーが適切に割り当てられた後、それが唯一のリダイレクトを試みるようにそれを遅くするための最良の方法だろうか?

シンプルdo...whileループが十分に働くかもしれないように私は感じる:

do 
{ 
    // Literally do nothing while the condition is true. 
} 
while (!HttpContext.Current.User.IsAuthenticated); 

はクッキーで

答えて

0

アイデンティティ情報ストア...しかし少しハックようです。あなたのシナリオでは、Cookieはまだ作成されていないので、HttpContext.Current.Userには識別情報は含まれていません。

持つdo whileループはあなたの問題を解決しません。

ゲットユーザの役割とデータベースから関連するデータのuserIdを使用して、そこ役割に応じてではなく、HttpContextからそれを取得しようとしているユーザーをリダイレクト。

これはUserManager.IsInRoleAsync(user.Id,"Admin")を使用して実現できます。

関連する問題