我已经设置了一个OWIN授权服务器和几个公开ASP.NET Web的资源服务器。我从授权服务器提供特定于每个资源服务器的JWT (其思想是每个资源服务器都需要将自定义声明包装在其令牌中)。
这些服务器都位于intranet环境中,在这种环境中,我们过去使用Windows身份验证(Kerberos)来提供单点登录体验。此功能在我的实现中丢失了,因为我使用用户的用户名和密码(根据AD进行身份验证)来授予令牌。我想知道的是,是否有办法重新获得单点登录体验-可能是通过使用Windows身份验证在向用户授予令牌之前确定用户的身份?
我觉得这有点不正统,而且可能很愚蠢--所以请告诉我有没有更好的替代方法来在intranet环境中使用OAuth 2.0实现单点登录。
发布于 2015-02-23 22:34:25
事实证明,这并不像我预期的那么难。我在另一个端点(/token/windows/)上创建了一个标准的web控制器。此终结点使用Windows用户尝试连接到的客户端(资源) ID接受HTTP POST。我将标准[Authorize]属性放在操作上以确保身份已建立,然后手动创建一个claims身份并向用户返回一个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/
}
}https://stackoverflow.com/questions/27217424
复制相似问题