道歉并提前感谢您提出这个问题!我还是SO的新手.
我一直在使用MVC5,EF6和VS 2013开发Web应用程序.
一旦发布,我花了一些时间升级到RC位.感谢所有伟大的帖子:例如.解耦Microsoft.AspNet.Identity.*并将asp.net MVC从5.0.0-beta2更新到5.0.0-rc1!
在我无限的智慧中,我决定转向@Hao Kung在这里发布的RTM位:我如何能够及早访问即将到来的Asp.Net Identity变化?.我认为当我们最终收到RTM版本时,我会省去麻烦并且不会太落后.
这可能是一场噩梦,或者我只是完全遗漏了某些东西(或两者兼而有之),因为我无法弄清楚曾经使用RC1的基本任务.
虽然我似乎是通过控制器登录用户(Asp.Net Identity RTM版本中的Microsoft.AspNet.Identity.Owin.AuthenticationManager在哪里?)...我的WindowsIdentity始终为空,在我调用SignIn后未经过身份验证.正确填充了user和claimIdentity对象.
这是我调用的操作方法(为了完整性将属性移动到局部变量):
[HttpPost, AllowAnonymous, ValidateAntiForgeryToken]
public virtual async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid) {
var userManager = new UserManager<EtdsUser>(new UserStore<EtdsUser>(new EtdsContext()));
var user = userManager.Find(model.UserName, model.Password);
if (user != null) {
var authenticationManager = HttpContext.GetOwinContext().Authentication;
authenticationManager.SignOut(new[] {DefaultAuthenticationTypes.ApplicationCookie, DefaultAuthenticationTypes.ExternalCookie, DefaultAuthenticationTypes.ExternalBearer});
var claimsIdentity = await userManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
authenticationManager.SignIn(new AuthenticationProperties { IsPersistent = model.RememberMe}, claimsIdentity);
return RedirectToLocal(returnUrl);
}
}
ModelState.AddModelError("", "The …Run Code Online (Sandbox Code Playgroud) 我有一个MVC 3应用程序,使用Windows身份验证和声明使用WIF 4.5.
通过AD组中的成员资格(当前)控制对应用程序的访问:
<deny users="?" />
<allow roles="domain\somegroup" />
<deny users="*" />
Run Code Online (Sandbox Code Playgroud)
除AD组外,我们还有需要添加的自定义角色.(此应用程序正在从Forms转换为Windows身份验证)
为了支持这些自定义角色(直到它们在AD中管理),我们将它们添加为ClaimTypes.GroupSid声明给用户,以便现有代码利用[Authorize("ADMIN")]并User.IsInRole("ADMIN")继续运行:
Application_PostAuthenticateRequest(object sender, EventArgs e)
{
var identity = ClaimsPrincipal.Current.Identity as WindowsIdentity;
var roles = userDAL.GetRoles(identity.Name);
foreach(var role in roles)
{
identity.AddClaim(new Claim(ClaimTypes.GroupSid, role));
}
}
Run Code Online (Sandbox Code Playgroud)
这一切都按预期工作.
除非当前用户不是某个自定义角色(如ADMIN)的成员,并且该角色在AD中也不存在
我们使用[Authorize("ADMIN")]Controller Action Methods,以及各种User.IsInRole("ADMIN")场景中的依赖实例.在那些发生错误并且应用程序爆炸的情况下.
AD基础架构正处于升级/迁移过程中.我不知道那里的所有细节,但我知道有一些域名,据说他们之间有信任,基础设施人员已经提到这些信任关系正在运行.
所以我想我想知道两件事:
这似乎不是我们的代码应该处理的东西.那么域名真的可能出现什么问题?我可以找出信任关系失败的"可信"域名吗?
解决这个问题的最佳方法是什么?我不喜欢编写辅助方法和Authorize()子类只是为了捕获这个异常.
我有我的asp.net Web服务器设置来使用Windows身份验证.
我正在使用当前登录的用户进行身份验证.
我可以通过查看来验证这个...
HttpContext.Current.User.Identity.Name
Run Code Online (Sandbox Code Playgroud)
我可以通过查看来验证我的身份验证...
HttpContext.Current.User.Identity.IsAuthenticated
Run Code Online (Sandbox Code Playgroud)
但是,当我调用.IsInRole函数时,我得到了信任关系错误...
HttpContext.Current.User.IsInRole("accounting")
Run Code Online (Sandbox Code Playgroud)
我在网上引用了提供域名和角色名称(域\会计)的问题,但我仍然得到同样的错误.关于在哪里查看或解决问题的任何建议?