You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:27:03