gpt4 book ai didi

asp.net - 将自定义角色添加到 ASP.NET MVC 5 中的 Windows 角色

转载 作者:行者123 更新时间:2023-12-04 15:43:16 30 4
gpt4 key购买 nike

我正在使用 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")] 装饰 Controller 时,即使用户(使用 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;
}

Controller 装饰有“标准”授权子句:
[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 and Windows Authentication with custom roles

按照@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 是否在方法内部获取某些内容。

关于asp.net - 将自定义角色添加到 ASP.NET MVC 5 中的 Windows 角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30082015/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com