在ASP.NET MVC 5中将自定义角色添加到Windows角色

安德里亚·潘泽里(Andrea Panzeri)

我正在使用ASP.NET MVC 5构建Intranet应用程序。

我的目标是通过Active Directory对任何用户进行身份验证(即,我正在使用“ Windows身份验证”),然后将组添加到应用程序内的任何用户(不使用域组)。

我在这里找到了一些非常有趣的代码:

http://brockallen.com/2013/01/17/adding-custom-roles-to-windows-roles-in-asp-net-using-claims/

但这在我的情况下不起作用:当我用[Authorize(Role =“ AppRole”)]装饰控制器时,即使用户(使用Claims)与“ AppRole”角色相关联,也无法获得授权。

这是我的代码:

在Global.asax.cs中

void Application_PostAuthenticateRequest()
    {
        if (Request.IsAuthenticated)
        {

            string[] roles = Utils.GetRolesForUser(User.Identity.Name);

            var id = ClaimsPrincipal.Current.Identities.First();
            foreach (var role in roles)
            {
                //id.AddClaim(new Claim(ClaimTypes.Role, role.ToString()));
                id.AddClaim(new Claim(ClaimTypes.Role, @"Kairos.mil\Compliance"));
            }


            bool pippo = User.IsInRole("Compliance");

            HttpContext.Current.User = (IPrincipal)id ;

            bool pippo2 = User.IsInRole("Compliance");


        }
    }

函数GetRolesForUser如下(并且工作正常):

 public static string[] GetRolesForUser(string username)
    {
        dbOrdiniPersonaliEntities db = new dbOrdiniPersonaliEntities();

        string utente = StripDomain(username);

        string[] gruppi = new string[db.vGruppiUtentis.Where(t => t.KairosLogin == utente).Count()];

        int i=0;

        foreach (var gruppo in db.vGruppiUtentis.Where(t => t.KairosLogin == utente))
        {

            gruppi[i]=gruppo.GruppoDes;
            i=i++;
        }
        return gruppi;
    }

控制器装饰有“标准” Authorize子句:

[Authorize(Roles="AppRole")]
    public ActionResult Index(string sortOrder, string currentFilter, string DesSearchString,int? page)
    {
      // my code here
    }

任何的想法?

提前致谢

更新

谢谢@Leandro我尝试了您建议的以下代码

void Application_PostAuthenticateRequest()
    {
        if (Request.IsAuthenticated)
        {

            string[] roles = Utils.GetRolesForUser(User.Identity.Name);

            ClaimsIdentity id = ClaimsPrincipal.Current.Identities.First();
            foreach (var role in roles)
            {
                //id.AddClaim(new Claim(ClaimTypes.Role, role.ToString()));
                id.AddClaim(new Claim(ClaimTypes.Role, @"Kairos.mil\Compliance"));
            }

            bool pippo = User.IsInRole("Compliance");

            SetPrincipal((IPrincipal)id);

            bool pippo2 = User.IsInRole("Compliance");


        }
    }

但是,当代码到达这一点时,我会收到运行时错误

SetPrincipal((IPrincipal)id);

错误如下

无法将类型为“ System.Security.Principal.WindowsIdentity”的对象转换为类型为“ System.Security.Principal.IPrincipal”的对象。

谢谢你的帮助

更新2(可能已解决)

嗨,深入了解SO,我发现了这个资源

具有自定义角色的ASP.NET MVC和Windows身份验证

按照@Xhalent的回答,我如下修改了我的代码

protected void Application_PostAuthenticateRequest()
    {
        if (Request.IsAuthenticated)
        {
            String[] roles = Utils.GetRolesForUser(User.Identity.Name);

            GenericPrincipal principal = new GenericPrincipal(User.Identity, roles);

            Thread.CurrentPrincipal = HttpContext.Current.User = principal;
        }
    }

现在看来工作正常!任何意见?有什么缺点吗?非常感谢!!

伦德罗

使用此方法保存主体,因此它也在线程中进行设置:

     private void SetPrincipal(IPrincipal principal)
        {
            Thread.CurrentPrincipal = principal;
            if (HttpContext.Current != null)
            {
                HttpContext.Current.User = principal;
            }
        }

更新:还允许匿名并测试User.IsInRole是否在方法内部获取了东西。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

基于ASP.NET MVC中角色的自定义用户授权

来自分类Dev

具有ASP.Net Identity的ASP.NET MVC5中的自定义验证和角色提供程序

来自分类Dev

如何在ASP.NET MVC Web API中创建角色并将用户添加到角色

来自分类Dev

ASP.NET MVC 5基于用户角色自定义Bootstrap导航栏

来自分类Dev

ASP.NET MVC 5自定义错误页面

来自分类Dev

ASP.NET MVC自定义角色提供程序不起作用

来自分类Dev

是否有将自定义Javascript添加到ASP.NET MVC 5页面的正确方法?

来自分类Dev

ASP.NET(MVC)用户,角色和角色中的用户

来自分类Dev

在ASP.NET MVC 5中将图像添加到数据库

来自分类Dev

在ASP .NET MVC中更改角色权限

来自分类Dev

使用组织帐户将自定义声明添加到ASP.NET MVC(多个租户)

来自分类Dev

Windows身份验证的ASP.NET 5自定义角色

来自分类Dev

删除ASP.NET MVC 5中的角色

来自分类Dev

在ASP.NET MVC和Azure AD中创建自定义用户角色

来自分类Dev

将自定义验证添加到ASP.NET Core的JWT令牌中?

来自分类Dev

无法将自定义设置文件添加到Asp.Net Core 3.1 WebApi

来自分类Dev

将自定义api端点添加到ASP:Net Core模板

来自分类Dev

ASP.NET Core 3.1 MVC Access拒绝基于角色的授权-与自定义UserClaimsPrincipalFactory发生冲突

来自分类Dev

如何将自定义字段添加到Json结果-ASP.NET MVC

来自分类Dev

将自定义类添加到ASP.NET MVC 4中的单选按钮

来自分类Dev

如何将自定义css文件添加到asp.net mvc中?

来自分类Dev

将自定义列添加到ASP.NET Identity

来自分类Dev

具有ASP.net MVC的自定义角色提供程序-更改角色

来自分类Dev

ASP.NET MVC 4-自定义成员资格和角色实体未更新

来自分类Dev

ASP.NET(MVC)用户,角色和角色中的用户

来自分类Dev

ASP MVC中的自定义角色提供程序

来自分类Dev

用户登录后将自定义属性添加到ASP.NET MVC身份

来自分类Dev

将自定义标头添加到iframe asp.net

来自分类Dev

ASP.NET MVC 5 自定义 RoleProvider 无法从数据库中检索用户名的角色

Related 相关文章

  1. 1

    基于ASP.NET MVC中角色的自定义用户授权

  2. 2

    具有ASP.Net Identity的ASP.NET MVC5中的自定义验证和角色提供程序

  3. 3

    如何在ASP.NET MVC Web API中创建角色并将用户添加到角色

  4. 4

    ASP.NET MVC 5基于用户角色自定义Bootstrap导航栏

  5. 5

    ASP.NET MVC 5自定义错误页面

  6. 6

    ASP.NET MVC自定义角色提供程序不起作用

  7. 7

    是否有将自定义Javascript添加到ASP.NET MVC 5页面的正确方法?

  8. 8

    ASP.NET(MVC)用户,角色和角色中的用户

  9. 9

    在ASP.NET MVC 5中将图像添加到数据库

  10. 10

    在ASP .NET MVC中更改角色权限

  11. 11

    使用组织帐户将自定义声明添加到ASP.NET MVC(多个租户)

  12. 12

    Windows身份验证的ASP.NET 5自定义角色

  13. 13

    删除ASP.NET MVC 5中的角色

  14. 14

    在ASP.NET MVC和Azure AD中创建自定义用户角色

  15. 15

    将自定义验证添加到ASP.NET Core的JWT令牌中?

  16. 16

    无法将自定义设置文件添加到Asp.Net Core 3.1 WebApi

  17. 17

    将自定义api端点添加到ASP:Net Core模板

  18. 18

    ASP.NET Core 3.1 MVC Access拒绝基于角色的授权-与自定义UserClaimsPrincipalFactory发生冲突

  19. 19

    如何将自定义字段添加到Json结果-ASP.NET MVC

  20. 20

    将自定义类添加到ASP.NET MVC 4中的单选按钮

  21. 21

    如何将自定义css文件添加到asp.net mvc中?

  22. 22

    将自定义列添加到ASP.NET Identity

  23. 23

    具有ASP.net MVC的自定义角色提供程序-更改角色

  24. 24

    ASP.NET MVC 4-自定义成员资格和角色实体未更新

  25. 25

    ASP.NET(MVC)用户,角色和角色中的用户

  26. 26

    ASP MVC中的自定义角色提供程序

  27. 27

    用户登录后将自定义属性添加到ASP.NET MVC身份

  28. 28

    将自定义标头添加到iframe asp.net

  29. 29

    ASP.NET MVC 5 自定义 RoleProvider 无法从数据库中检索用户名的角色

热门标签

归档