Dot-Net
將 Windows 身份驗證與 OAuth 2.0 結合使用
我已經設置了一個 OWIN 授權伺服器和幾個公開 ASP.NET Web API 的資源伺服器。我正在從特定於每個資源伺服器的授權伺服器提供 JWT(想法是每個資源伺服器都需要將自定義聲明包含在其令牌中)。
這些伺服器都位於 Intranet 環境中,我們過去一直使用 Windows 身份驗證 (Kerberos) 來提供單點登錄體驗。此功能在我的實現中失去了,因為我使用使用者的使用者名和密碼(針對 AD 進行身份驗證)來授予令牌。我想知道是否有一種方法可以恢復單點登錄體驗 - 也許通過在授予使用者令牌之前使用 Windows 身份驗證來建立使用者身份?
我覺得這有點不正統,可能很愚蠢 - 所以請告訴我是否有更好的替代方法可以在 Intranet 環境中使用 OAuth 2.0 獲取 SSO。
事實證明,這並不像我預期的那麼難。
/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/ } }