我已经设置了一个OWIN授权服务器和几个公开ASP.NET Web API的资源服务器.我从授权服务器提供特定于每个资源服务器的JWT(这个想法是每个资源服务器需要在其令牌中包含自定义声明).
这些服务器都在Intranet环境中,我们历来使用Windows身份验证(Kerberos)来提供单点登录体验.此功能在我的实现中已丢失,因为我使用用户的用户名和密码(针对AD进行身份验证)来授予令牌.我想知道的是,是否有办法获得单点登录体验 - 也许通过使用Windows身份验证来确定用户的身份,然后授予他们一个令牌?
我觉得这有点不正统,可能会很愚蠢 - 所以请告诉我是否有更好的替代方法在Intranet环境中使用OAuth 2.0获取SSO.
事实证明,这并不像我预期的那么难.我从另一个端点(/token/windows/
)创建了一个标准的Web API控制器.此端点使用Windows用户尝试连接的客户端(资源)ID进行HTTP POST.我将标准[Authorize]
属性放在操作上以确保建立标识,然后我手动创建声明标识并将JWT返回给用户.从那时起,用户就使用标准令牌刷新过程.
编辑:这是下面的示例,代表我实现的内容.请注意,此应用程序在IIS中配置为支持Windows身份验证(除了匿名身份验证):
[RoutePrefix("token/windows")] public class WindowsAuthenticationController : ApiController { [Authorize] [HttpPost] [Route("{client_id}"] public async Task<IHttpActionResult> CreateTokenForWindowsIdentity(string client_id) { var user = User as ClaimsPrincipal; if (user == null) return Unauthorized(); //401 var claims = //generate claims based on the User.Identity.Name... var identity = new ClaimsIdentity("JWT"); identity.AddClaims(claims); //manually create JWT using whatever method you prefer, //I used something inspired from http://bitoftech.net/2015/02/16/implement-oauth-json-web-tokens-authentication-in-asp-net-web-api-and-identity-2/ } }