2016-04-29 7 views
0

私はasp.netアプリケーションで作業しています。私は4つの役割を持つaspnetrolesテーブルがあります。aspnet IDを使用してログイン中にユーザーの役割を確認する

:ログインながら

var user = new ApplicationUser { UserName = model.Email, Email = model.Email}; 
       var result = await UserManager.CreateAsync(user, model.Password); 
       **UserManager.AddToRole(user.Id, model.UserRole);** 

は今、私はこのようなログインアクションの結果で確認しています:AccountController登録Actionメソッドで

**Id Name** 
1 Admin 
4 Consumer 
2 Provider 
3 SaleUser 

を、私はこれを追加しましたaspnetusersとaspnetuserolesテーブルに正しいデータがあることがわかります。

var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false); 


    if (User.IsInRole(model.UserRole)) 
          return RedirectToLocal(returnUrl); 

ただし、条件は満たされません。ユーザーが特定の役割に属しているかどうかを確認する方法

IはStartup.cs ConfigureAuth方法で次の行を追加しました:

app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create); 

とidentityConfigクラスでこのクラス:

public class ApplicationRoleManager : RoleManager<IdentityRole> 
    { 
     public ApplicationRoleManager(IRoleStore<IdentityRole, string> store) : base(store) 
     { 
     } 
     public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context) 
     { 
      var roleStore = new RoleStore<IdentityRole>(context.Get<ApplicationDbContext>()); 
      return new ApplicationRoleManager(roleStore); 
     } 
    } 

とaccountcontrollerでこのコード:

private ApplicationRoleManager roleManager; 
     public ApplicationRoleManager RoleManager 
     { 
      get 
      { 
       return this.roleManager ?? HttpContext.GetOwinContext().Get<ApplicationRoleManager>(); 
      } 
      private set { this.roleManager = value; } 
     } 

でも同じ問題

更新

VARユーザー=新しいClaimsPrincipal(AuthenticationManager.AuthenticationResponseGrant.Identity)。

    if (User.IsInRole(model.UserRole)) 
         return RedirectToLocal(returnUrl); 
        else 
        { 

         AuthenticationManager.AuthenticationResponseGrant = null; 

         model.Roles = GetRoles(); 
         ModelState.AddModelError("", "You cannot login as " + model.UserRole); 
         return View(model); 
        } 
+0

更新されたコードセクションに 'if(User.IsInRole(model.UserRole))'が入力されますか? –

答えて

1

この

if (result == SignInStatus.Success) 
{ 
    var user = new ClaimsPrincipal(AuthenticationManager.AuthenticationResponseGrant.Identity); 

    if (user.IsInRole(model.UserRole)) 
    {  
     return RedirectToLocal(returnUrl); 
    } 
    else 
    { 
     AuthenticationManager.AuthenticationResponseGrant = null; 
     model.Roles = GetRoles(); 
     ModelState.AddModelError("", "You cannot login as " + model.UserRole); 
     return View(model); 
    } 
} 

ModelState.AddModelError("", "Invalid login attempt."); 
return View(model); 

を試してみてください問題がUserを使用すると、ブラウザに送信されてきたクッキーに応じて作成されていることですが、その時点で、あなたはまだそれらを送信していません。

+0

ありがとうございます。これはうまくいった。 1つの問題のみ。私が間違った役割を選択すると、エラーメッセージが表示され、その後、再度ログインしようとすると、「この偽造トークンは、現在のユーザーとは異なるクレームベースのユーザーのものです」というメッセージが表示されます。 –

+0

@ user1125955あなたの意見が分かりました。私の解決策を更新しました –

+0

@ user1125955役割が間違っている場合は、 'AuthenticationManager.AuthenticationResponseGrant'を' null'に設定します。 –

関連する問題