使用Windows身份验证与OAuth 2.0

13
我已经建立了一个OWIN授权服务器和几个公开ASP.NET Web API的资源服务器。 我正在从授权服务器提供针对每个资源服务器特定的JWT(想法是每个资源服务器都需要在其令牌中包含自定义声明)。
这些服务器都位于内部网络环境中,我们过去一直使用Windows身份验证(Kerberos)提供单一登录体验。由于我正在使用用户的用户名和密码(通过AD进行身份验证)来授予令牌,因此该功能已丢失在我的实现中。我想知道是否有一种方法可以重新获得单一登录体验——也许是通过使用Windows身份验证来确定用户身份,然后再授予他们令牌?
我觉得这种做法有点不太正统,可能有些愚蠢,请告诉我是否有更好的替代方法来在intranet环境中使用OAuth2.0实现SSO。
1个回答

11

事实证明,这比我预期的要容易。 我创建了一个标准的Web API控制器,以替代端点(/token/windows/)。 这个端点接受带有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/
    }
}

你有代码示例或任何链接展示如何完成这个吗? - Eric Burdo
2
Joshua,你的授权服务器和资源服务器是相同的还是不同的?如果你正在进行基于角色的资源服务器,那么通过包装[Authorize]属性会与为令牌消费配置的内容发生冲突。当你调用“CreateTokenForWindowsIdentity”时,由于这个Authorize属性,它会期望请求具有有效的令牌。你是如何设计你的资源和认证服务器来实现Windows身份验证和基于令牌的身份验证的呢?谢谢。 - nav
3
注意:如果有人看到这个问题/答案——我认为这个设置不太理想,有点巧妙。我已经开始使用 OpenID 连接设置,其中我有一个单独的(Windows 认证的)服务作为身份提供者。 - Joshua Barron
3
@JoshuaBarron,您能否提供一些关于在您的身份验证服务器中实现Windows身份验证+OpenID或OAuth的见解? - ciril sebastian
1
@JoshuaBarron,你能分享一下你的解决方案的更多细节吗? - Diego Dias
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接