C# - ASP.NET MVC 单点登录和角色
  vZWjDTJ9QSrC 2023年11月02日 28 0

我在 2 个 MVC 站点(称它们为 SiteA 和 SiteB)上使用了基本的单点登录,使用的方法与以下方法类似:

它们位于同一域的子域上,并在 web.config 中共享散列\加密 key 等。我修改了 cookie,以便同一域中的所有站点都可以访问它。所有这一切似乎工作正常。

这些站点位于不同的服务器 上,无法访问同一个 SQL 数据库,因此实际上只有 SiteA 保存用户登录详细信息。 SiteB 有一个成员(member)数据库,但没有用户。

这适用于我需要的场景:

1) 用户登录SiteA

2) 应用程序从 SiteA(通过 AJAX)和 SiteB(通过 AJAX 使用 JSONP)加载数据

我在 SiteA 的 AccountController 上有以下登录操作,这是“魔法”发生的地方:

[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        if (MembershipService.ValidateUser(model.UserName, model.Password))
        {
            FormsService.SignIn(model.UserName, model.RememberMe);

            //modify the Domain attribute of the cookie to the second level of domain
            // Add roles  
            string[] roles = Roles.GetRolesForUser(model.UserName);
            HttpCookie cookie = FormsAuthentication.GetAuthCookie(User.Identity.Name, false);
            FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
            // Store roles inside the Forms cookie.  
            FormsAuthenticationTicket newticket = new FormsAuthenticationTicket(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);

            if (!String.IsNullOrEmpty(returnUrl))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }
        else
        {
            ModelState.AddModelError("", "The user name or password provided is incorrect.");
        }
    }

这做了一些我在初始场景中不需要的东西,但与我的问题有关。它将登录到 SiteA 的用户的角色列表插入到身份验证票证的用户数据中。然后通过 global.asax 中的以下内容在 SiteB 上“恢复”:

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    if (Context.Request.IsAuthenticated)
    {
        FormsIdentity ident = (FormsIdentity) Context.User.Identity;
        string[] arrRoles = ident.Ticket.UserData.Split(new[] {'|'});
        Context.User = new System.Security.Principal.GenericPrincipal(ident, arrRoles);
    }
}

在我将角色添加到混合中之前,上面的所有内容都有效。如果我只使用 [Authorize] 属性装饰我在 SiteB 上的 Controllers\Actions,一切都会正常进行。但是一旦我添加 [Authorize(roles="TestAdmin")] 用户就无法再访问该 Controller 操作。显然我已将用户添加到 TestAdmin 角色。

如果我在 SiteB 上调试 global.asax 代码,当我离开 global.asax 代码时它看起来没问题,但是当我在 Controller 本身中遇到断点时,Controller.User 和 Controller.HttpContext.User 现在是不再设置角色的 System.Web.Security.RolePrincipal。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  gBkHYLY8jvYd   2023年12月06日   50   0   0 #includecii++
  gBkHYLY8jvYd   2023年12月09日   30   0   0 cii++数据
  gBkHYLY8jvYd   2023年12月06日   24   0   0 cii++依赖关系
  lh6O4DgR0ZQ8   2023年11月24日   18   0   0 cii++c++
  gBkHYLY8jvYd   2023年11月22日   23   0   0 ioscii++
  gBkHYLY8jvYd   2023年12月08日   21   0   0 #includecii++
  gBkHYLY8jvYd   2023年12月11日   20   0   0 cic++最小值
  gBkHYLY8jvYd   2023年11月22日   26   0   0 #includeiosci