将Windows身份验证与OAuth 2.0一起使用

Jos*_*ron 10 .net windows-authentication single-sign-on oauth-2.0 owin

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

这些服务器都在Intranet环境中,我们历来使用Windows身份验证(Kerberos)来提供单点登录体验.此功能在我的实现中已丢失,因为我使用用户的用户名和密码(针对AD进行身份验证)来授予令牌.我想知道的是,是否有办法获得单点登录体验 - 也许通过使用Windows身份验证来确定用户的身份,然后授予他们一个令牌?

我觉得这有点不正统,可能会很愚蠢 - 所以请告诉我是否有更好的替代方法在Intranet环境中使用OAuth 2.0获取SSO.

Jos*_*ron 8

事实证明,这并不像我预期的那么难.我从另一个端点(/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/
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 任何人发现这个问题/答案的注意事项 - 我不认为这种设置是最佳的,并且有点hacky.我已经转移到使用一个OpenID连接设置,其中我有充当身份提供商单独的(Windows验证)服务. (3认同)
  • @JoshuaBarron您能否提供一些有关身份验证服务器中的 Windows 身份验证 + openID 或 oauth 实现的见解 (3认同)
  • Joshua,你的授权服务器和资源服务器是相同的还是不同的?如果您正在执行基于角色的资源服务器,那么通过包装 [Authorize] 属性将与为令牌消耗配置的内容发生冲突。当您调用“CreateTokenForWindowsIdentity”时,由于此 Authorize 属性,它会期望请求具有有效的令牌。您如何构建资源和身份验证服务器来实现 Windows 身份验证和基于令牌的身份验证?谢谢 (2认同)