我已经设置了一个 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(使用前将#替换为@)