MVC:使用AAD身份验证时添加和编辑身份声明角色名称

时间:2019-06-13 08:24:57

标签: c# asp.net-mvc openid-connect claims-based-identity

我使用AAD登录并验证用户身份,不幸的是,我无法从AAD中使用基于角色的内容,因此我需要依赖数据库中设置的角色,但是,我不知道如何基于数据库中的内容为此用户添加角色,而又不影响身份验证cookie?

但是我设法在Startup.Auth内的app.UseOpenIdConnectAuthentication内手动添加了一个角色,就像这样

Notifications = new OpenIdConnectAuthenticationNotifications
           {
             AuthenticationFailed = (context) =>
             {
                context.HandleResponse();
                context.OwinContext.Response.Redirect("/Account/Login");
                return Task.FromResult(0);
             },
             SecurityTokenValidated = async (x) =>
             {
                var identity = x.AuthenticationTicket.Identity;
                //check the name, add additional claims 
                identity.AddClaim(new Claim("http://schemas.microsoft.com/ws/2008/06/identity/claims/role", "Administrator"));

                await Task.FromResult(0);
              }
            }

但是,当我手动添加Administrator时,我不知道如何基于链接到数据库中用户的角色来更改此设置。我以为一旦角色碰到了我的控制器(这是我的住所/索引),我也许就可以更新该角色,但努力寻找可以起作用的东西。

我想使用User.IsInRole("UserRoleNameHere")

任何帮助或想法将不胜感激!

1 个答案:

答案 0 :(得分:0)

我能够找到解决方案!最终,我要做的是向ClaimsIdentity添加一个新的声明,注销以清除之前存储的身份,然后再次登录以使用新添加的声明添加新的身份:

            var result = (from U in db.Users
                          from R in U.Roles
                          join R2 in db.Roles on R.RoleId equals R2.Id
                          where U.Id == loggedInUserId
                          select new { R2.Name, U.UserName }).FirstOrDefault();

            ClaimsIdentity identity = (ClaimsIdentity)User.Identity;
            identity.AddClaim(new Claim("http://schemas.microsoft.com/ws/2008/06/identity/claims/role", result.Name));

            IOwinContext context = new OwinContext();

            context.Authentication.SignOut(DefaultAuthenticationTypes.ExternalCookie);
            context.Authentication.SignIn(identity);

            await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);

            if (User.IsInRole("Administrator"))
            {
                isAdmin = true;
            }