首页 新闻 会员 周边

单点登录问题

0
悬赏园豆:50 [待解决问题]

门户网站通过单点登录访问业务网站时通过header的方式传递了两个值,一个是user,一个是token我在业务系统的验证页面能接收到这个两个值,直接将传递过来的值赋给那两个变量时,直接访问验证页面时能直接跳转进去,但是直接用单点登录时无法访问进去,跳转到登录界面

问题补充:

当业务系统已经登录后可以直接跳转进去

Lyndon_W的主页 Lyndon_W | 初学一级 | 园豆:156
提问于:2023-07-28 11:20
< >
分享
所有回答(2)
0

根据你的描述,当直接访问验证页面时,你能够接收到这两个值并将其赋给相应的变量,然后能够成功跳转进去。但是当通过单点登录时,无法直接访问进去,而是跳转到登录界面。

这种情况可能是由于业务系统在处理单点登录时,对于已经登录的用户进行了验证,发现没有登录状态,因此跳转到登录界面。

解决这个问题的一种可能方法是,在业务系统的验证页面中,对于已经传递过来的user和token进行验证,如果验证通过,则将用户标记为已登录状态,并重定向到业务系统的主页或其他需要登录后才能访问的页面。这样,无论是直接访问验证页面还是通过单点登录访问,都能够成功跳转进去。

具体的实现方式可能因业务系统的不同而有所差异,但基本的思路是在验证页面对用户进行验证并标记登录状态。你可以查看业务系统的登录逻辑和验证页面的代码,看是否有相关的逻辑来处理这种情况。

另外,还需要确保单点登录的配置和流程正确无误,确保门户网站能够正确传递user和token值到业务系统。如果单点登录的配置有问题,也可能导致无法成功登录。

下面是示例代码:

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter("/*")
public class SsoFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        // 检查用户是否已经登录
        boolean isLoggedIn = checkLoginStatus(httpRequest);

        if (isLoggedIn) {
            // 用户已经登录,继续请求处理流程
            chain.doFilter(request, response);
        } else {
            // 用户未登录,重定向到登录页面
            httpResponse.sendRedirect("/login");
        }
    }

    // 检查用户登录状态的逻辑
    private boolean checkLoginStatus(HttpServletRequest request) {
        String user = request.getParameter("user");
        String token = request.getParameter("token");

        // 在这里进行用户登录状态的验证,例如验证用户和token是否匹配
        // 这里只是一个示例,实际的验证逻辑需要根据具体情况来实现
        return "admin".equals(user) && "123456".equals(token);
    }

    // 其他方法
    // ...

}
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/validate")
public class ValidateServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String user = request.getParameter("user");
        String token = request.getParameter("token");

        // 在这里进行用户登录状态的验证,例如验证用户和token是否匹配
        // 这里只是一个示例,实际的验证逻辑需要根据具体情况来实现
        boolean isValid = "admin".equals(user) && "123456".equals(token);

        if (isValid) {
            // 用户验证通过,将用户标记为已登录状态
            request.getSession().setAttribute("user", user);

            // 重定向到业务系统的主页或其他需要登录后才能访问的页面
            response.sendRedirect("/home");
        } else {
            // 用户验证失败,重定向到登录界面
            response.sendRedirect("/login");
        }
    }

    // 其他方法
    // ...

}

在上面的示例代码中,我们将ValidateServlet用于验证用户登录状态,SsoFilter用于处理单点登录逻辑。

ValidateServlet中,我们在doGet方法中获取用户和token参数,并进行用户登录状态的验证。如果验证通过,我们将用户标记为已登录状态,并重定向到业务系统的主页或其他需要登录后才能访问的页面。如果验证失败,我们将重定向到登录界面。

SsoFilter中,我们在doFilter方法中检查用户是否已经登录。如果用户已经登录,我们继续请求处理流程。如果用户未登录,我们将用户重定向到登录页面。

你需要将这两个类注册到你的业务系统中,可以使用@WebServlet@WebFilter注解或在web.xml文件中进行配置。

请注意,这只是一个简单的示例代码,实际的单点登录实现可能涉及到更复杂的逻辑和安全性考虑。你可以根据自己的需求和具体情况来进行修改和扩展。

lanedm | 园豆:2378 (老鸟四级) | 2023-07-30 21:17

您好!可能我描述的有误,我重新整理了一下问题是这样的
1、直接通过门户的单点登录进入业务系统,在业务系统的的验证页面能接收到门户网站传递过来的token和user两个值,但是无法直接跳转到业务系统的主页
2、但是当我业务系统已经登录了之后,通过门户网站的单点登录,可以跳转到业务系统的业务页面或业务环节

支持(0) 反对(0) Lyndon_W | 园豆:156 (初学一级) | 2023-07-31 10:05

@Lyndon_W: 您可以按照以下步骤修改ValidateServlet和SsoFilter代码:

  1. ValidateServlet:在接收到门户网站传递过来的token和user值后,将这些值存储在会话(Session)中,以便后续使用。然后,您可以通过重定向或转发将用户跳转到业务系统的主页。
@WebServlet("/validate")
public class ValidateServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取门户网站传递过来的token和user值
        String token = request.getParameter("token");
        String user = request.getParameter("user");

        // 将token和user值存储在会话中
        HttpSession session = request.getSession();
        session.setAttribute("token", token);
        session.setAttribute("user", user);

        // 重定向到业务系统的主页
        response.sendRedirect("business/home");
    }
}
  1. SsoFilter:在过滤器中,您需要检查用户是否已经登录到业务系统。如果用户已经登录,可以直接放行请求。如果用户未登录,则将用户重定向到门户网站进行单点登录。
@WebFilter("/*")
public class SsoFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

        // 检查用户是否已经登录到业务系统
        HttpSession session = request.getSession();
        if (session.getAttribute("user") != null) {
            // 用户已经登录,直接放行请求
            chain.doFilter(request, response);
        } else {
            // 用户未登录,重定向到门户网站进行单点登录
            response.sendRedirect("https://portal.com/sso?redirectUrl=" + request.getRequestURL());
        }
    }
}

在上述代码中,ValidateServlet接收到门户网站传递过来的token和user值后,将其存储在会话中。然后,通过重定向将用户跳转到业务系统的主页。

SsoFilter过滤器用于检查用户是否已经登录到业务系统。如果用户已经登录,直接放行请求。如果用户未登录,则将用户重定向到门户网站进行单点登录。在重定向URL中,使用redirectUrl参数指定用户登录成功后要跳转的页面。

请根据您的实际情况修改代码,并确保在业务系统的验证页面中正确获取并存储门户网站传递过来的token和user值。

支持(0) 反对(0) lanedm | 园豆:2378 (老鸟四级) | 2023-07-31 10:09

@lanedm: 您好!我这边用的是C#用的不是java ,在后面的环节我也没有用到token,token就在验证页面用到的我业务系统实现的代码是

string username = Request.Headers["iv-user"];//接收门户网站传递过来的用户
string token = Request.Headers["token"];//接收门户网站传递过来的token
string dateTime = DateTime.Now.ToString("yyyy-MM-dd");
string md5Str = StrHelper.EncryptPassword(dateTime + username, StrHelper.PasswordType.MD5);//使用MD5对用户数据进行加密

        token = token == null ? token : token.Substring(8, 16).ToLower();//截取加密后密文得8到16位,进行验证

        if (string.Equals(md5Str, token))//用截取后的token和加密后的密文进行验证
        {
            UserDAL bs = new UserDAL();
            Govaze.Model.User s = bs.getByUserName(username);
            SessionUser ss = new SessionUser();
            ss.UserName = s.UserName;
            ss.RealName = s.RealName;
            ss.Email = s.Email;
            Govaze.Components.Module.BaseLogin.SetSession(ss);//保存Session
            HttpCookie cookie = new HttpCookie("Govaze_Theme", Govaze.SQLServerDAL.Factory.getUserDAL().aUsergetTheme(s.UserName));
            cookie.Expires = DateTime.Now.AddYears(1);
            Response.Cookies.Add(cookie);

            Response.Redirect(CASHOST + "Master");
        }
        else {
            HttpContext.Current.Response.Redirect(CASHOST + "Login", true);//没有登录
        }

当我用门户网站上传递过来的token和user的值直接赋值给username和token 时,直接访问验证页面就可以直接登录,那个门户网站用的时域名业务系统用的是IP这样在session的传递中会不会有影响?

支持(0) 反对(0) Lyndon_W | 园豆:156 (初学一级) | 2023-07-31 14:50

@Lyndon_W: 在您的业务系统中,您可以直接将门户网站传递过来的用户名和token值赋值给usernametoken变量,然后进行验证。这样做是可以的,不会对验证过程产生影响。

至于域名和IP的问题,如果您的门户网站和业务系统在不同的域名下,可能会存在跨域的问题。在这种情况下,您需要在业务系统的响应中设置跨域请求的头部信息,允许来自门户网站域名的请求。

如果您的业务系统使用的是IP而不是域名,也可以正常工作。只需确保在验证过程中使用正确的IP地址进行跳转和重定向即可。

支持(0) 反对(0) lanedm | 园豆:2378 (老鸟四级) | 2023-08-01 08:12
0

你这儿遇到的问题,典型是从A网页登录成功后 跳转B网页,B网页获取到token于是成功进入登录后页面。给你建议是,cookie或是token,不论是从地址栏明文获取(vue可以这么做,#c不确定)或是在本地,临时缓存内得到。他们都要走入你的登录判定中。我最大的不确定性是,我不清楚B页面的username 和 password使用的登录接口是否和A网页的登录接口一致。
而针对你的提问
user,token在业务系统的验证页面能接收到这个两个值,直接将传递过来的值赋给那两个变量时,直接访问验证页面时能直接跳转进去,但是直接用单点登录时无法访问进去,跳转到登录界面
这里或许需要你或许需要可以打印一下,看看你的接收页(登录页),是否将值成功赋给了两个字段。点击登录时,你不妨printf一下

予时光宁静以致远 | 园豆:202 (菜鸟二级) | 2023-08-05 15:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册