Windows服务器下Go后端实现SPNEGO单点登录的可运行示例咨询
Go Web 服务实现集成Windows身份验证(SSO)可运行示例
前置准备
- 已在域控制器为你的Go服务注册SPN,格式为
HTTP/<服务域名>@<域后缀>,例如HTTP/app.internal.corp@CORP.COM - 已导出服务对应的keytab密钥文件,可通过域控制器的ktpass工具生成
- 客户端浏览器已配置信任你的服务站点,自动传递Kerberos身份凭证
依赖安装
执行以下命令安装依赖库:go get github.com/jcmturner/gokrb5/v8
完整可运行代码
package main import ( "fmt" "log" "net/http" "github.com/jcmturner/gokrb5/v8/keytab" "github.com/jcmturner/gokrb5/v8/service" "github.com/jcmturner/gokrb5/v8/spnego" ) // 替换为你自己的配置 const ( KEYTAB_PATH = "/path/to/your/service.keytab" // keytab文件存放路径 SERVICE_SPN = "HTTP/app.internal.corp@CORP.COM" // 你注册的服务SPN LISTEN_ADDR = ":9000" // 服务监听端口 ) func main() { // 加载keytab文件 kt, err := keytab.Load(KEYTAB_PATH) if err != nil { log.Fatalf("加载keytab失败: %v", err) } // 配置SPNEGO认证中间件 spnegoConfig := service.NewSettings( service.Keytab(kt), service.SName(SERVICE_SPN), ) // 业务路由,访问根路径触发认证 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { // 校验身份,认证失败会自动返回协商头触发浏览器认证流程 ctx, ok := spnego.ValidateHTTPRequest(spnegoConfig, w, r) if !ok { return } // 认证通过,获取Windows登录用户名和域信息 username := ctx.CName().PrincipalNameString() realm := ctx.Realm() w.Header().Set("Content-Type", "text/plain; charset=utf-8") fmt.Fprintf(w, "SSO认证通过\nWindows登录账号: %s\n所属域: %s\n", username, realm) }) log.Printf("服务启动,监听地址 %s", LISTEN_ADDR) log.Fatal(http.ListenAndServe(LISTEN_ADDR, nil)) }
运行说明
- 替换代码中
KEYTAB_PATH、SERVICE_SPN两个常量为你实际的配置值 - 确保运行Go服务的服务器可以连通域控制器的88端口(Kerberos认证端口)
- 域内客户端使用浏览器访问服务地址时,会自动完成身份验证,无需输入账号密码,直接返回当前登录的Windows账号信息
注意:如果服务部署在非域成员机器上,需要额外配置krb5.conf文件指定域控制器地址,域成员机器可自动读取系统域配置无需额外设置
内容的提问来源于stack exchange,提问作者Andrew W. Phillips
相关产品推荐
相关产品推荐

