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

时间:2014-11-30 19:45:31

标签: .net oauth-2.0 single-sign-on windows-authentication owin

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

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

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

1 个答案:

答案 0 :(得分: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/
    }
}