ASP.NETMVC单点登录和角色我正在使用基于以下方法的东西在2个MVC站点(称为SiteA)上进行基本单点登录和SiteB)登录:http://forums.asp.net/p/1023838/2614630.aspx它们位于同一域的子域上,并在web.config中共享哈希加密密钥等。我修改了cookie,以便可以访问同一域中的所有站点。所有这一切似乎工作正常。这些站点位于不同的服务器上,无法访问相同的SQL数据库,因此实际上只有SiteA具有用户登录详细信息。SiteB有一个会员数据库,但对用户来说是空白的。这适用于我想要的场景,即:1)用户登录到SiteA2)应用程序从SiteA(通过AJAX)和SiteB(通过使用JSONP的AJAX)加载数据我在SiteA的AccountController上有以下登录操作,这是“神奇的地方”发生:[HttpPost]publicActionResultLogOn(LogOnModelmodel,stringreturnUrl){if(ModelState.IsValid){if(MembershipService.ValidateUser(model.UserName,model.Password)){FormsService.SignIn(model.UserName,model.记住账号);//修改cookie的Domain属性为二级域//添加角色string[]roles=Roles.GetRolesForUser(model.UserName);HttpCookiecookie=FormsAuthentication.GetAuthCookie(User.Identity.Name,false);FormsAuthenticationTicketticket=FormsAuthentication.Decrypt(cookie.Value);//将角色存储在Formscookie中。FormsAuthenticationTicketnewticket=newFormsAuthenticationTicket(ticket.Version,model.UserName,ticket.IssueDate,ticket.Expiration,ticket.IsPersistent,String.Join("|",roles),ticket.CookiePath);cookie.Value=FormsAuthentication.Encrypt(newticket);cookie.HttpOnly=false;cookie.Domain=ConfigurationManager.AppSettings["Level2DomainName"];Response.Cookies.Remove(cookie.Name);Response.AppendCookie(cookie);如果(!String.IsNullOrEmpty(returnUrl)){返回重定向(returnUrl);}else{returnRedirectToAction("Index","Home");}}else{ModelState.AddModelError("","提供的用户名或密码不正确。");这对我做了一些事情最初的场景并不是严格需要的,但与我的问题相关的是将登录到SiteA的用户的角色列表插入到身份验证票证的UserData中。然后通过global.asax中的以下内容在SiteB上“恢复”:string[]arrRoles=ident.Ticket.UserData.Split(new[]{'|'});Context.User=newSystem.Security.Principal.GenericPrincipal(ident,arrRoles);上面的一切都有效,直到我将角色添加到组合中。如果我只是用[Authorize]属性装饰SiteB上的ControllersActions,一切正常。但是一旦我添加[Authorize(roles="TestAdmin")],用户就无法再访问该控制器操作。显然,我已将用户添加到TestAdmin角色。如果我在SiteB上调试global.asax代码,它看起来没问题,因为我留下了global.asax代码,但是当我在控制器本身中遇到断点时,Controller.User和Controller.HttpContext.User现在是一个系统。Web.Security.RolePrincipal不再设置角色。所以我的问题是:有谁知道如何恢复SiteB上的角色或通过其他方式恢复角色?您已经解决了它,但我们开始吧:让它工作:关闭角色管理器。asp.net的行为并不奇怪,因为您明确告诉它使用指定的配置来查找用户的角色。另一种方式:在两者中启用角色管理器。使用配置来共享cookie,就像在自定义代码中一样。根据您的描述,您不必担心尝试为用户获取角色,只要您使用匹配的身份验证cookie配置您应该使用Application_AuthorizeRequest来设置角色cookie吗?恕我直言,较早的一点(身份验证)是最好的,我总是这样做并且从来没有问题。由于这似乎停滞不前,我可以用一些额外的发现来部分回答这个问题。在调试和测试之后,似乎MVC2在离开Application_AuthenticateRequest之后但在进入我的控制器之前做了一些奇怪的事情。此处有更多详细信息:http://forums.asp.net/t/1597075.aspx解决方法是使用Application_AuthorizeRequest而不是Application_AuthenticateRequest。编辑:我相信我找到了问题的原因。在我的MVC1项目中,我禁用了roleManager,但我的测试MVC2项目启用了roleManager。在MVC1测试项目中启用我的roleManager后,MVC1和MVC2之间的行为是相同的。我还向MVCMicrosoft团队提出了一个问题,如果Application_AuthorizeRequest是从身份验证票证cookie中恢复角色的正确位置,我将在这里回复...以上是C#学习教程:ASP.NETMVC单点登录和角色分享如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: