将 Windows 身份验证与 OAuth 2.0 结合使用

2024-01-12

我已经设置了一个 OWIN 授权服务器和几个公开 ASP.NET Web API 的资源服务器。我正在从授权服务器提供一个特定于每个资源服务器的 JWT(其想法是每个资源服务器都需要将自定义声明封装在其令牌中)。

这些服务器都位于 Intranet 环境中,我们过去曾使用 Windows 身份验证 (Kerberos) 来提供单点登录体验。此功能在我的实现中已丢失,因为我使用用户的用户名和密码(根据 AD 进行身份验证)来授予令牌。我想知道是否有一种方法可以恢复单点登录体验 - 也许可以在授予用户令牌之前使用 Windows 身份验证来建立用户的身份?

我觉得这有点不正统,可能很愚蠢 - 所以请告诉我是否有更好的替代方法来在内网环境中使用 OAuth 2.0 实现 SSO。


事实证明,这并不像我想象的那么难。我从另一个端点创建了一个标准的 Web API 控制器(/token/windows/)。此端点采用带有 Windows 用户尝试连接的客户端(资源)ID 的 HTTP POST。我把标准[Authorize]操作上的属性以确保建立身份,然后我手动创建声明身份并将 JWT 返回给用户。从那时起,用户使用标准令牌刷新过程。

Edit:下面是一个代表我实现的示例。请注意,此应用程序在 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/
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Windows 身份验证与 OAuth 2.0 结合使用 的相关文章

随机推荐