2016-10-21 35 views
0

我需要連接到外部API來驗證用戶憑證並從IdSrvr中的自定義UserService中獲取用戶的聲明,但使用Client Credentials就好像IdentityServer是連接到另一服務的客戶端。IdentityServer3上的UserService中的客戶端證書

應該採取什麼方法?

想到的第一件事就是在UserService中創建一個HttpClient實例,以連接到IdentityServer本身併發出請求......但我不知道是否有更好的方法。

回答

2

OwinEnviroment擴展方法可讓您發佈令牌。

public MyCustomUserService(OwinEnvironmentService owin) 
    { 
     _owin = owin; 
    } 

    public async Task AuthenticateLocalAsync(LocalAuthenticationContext context) 
    { 

     var token = await _owin.Environment.IssueClientToken(
      clientId: "Banana", 
      scope: "resource1", 
      lifetime: 3600); 

     // call protected API with token 
    } 

Link to GitHub issue with same question

+0

非常感謝!這工作像一個魅力! – CesarD

0

有一個稱爲ResourceOwner格蘭特的資助。請相應地閱讀spec。當有一個高程度的資源所有者和客戶端之間 信任

憑證應僅被使用(例如,客戶端 是設備操作系統的一部分或一個高特權
應用)

大多數人會強烈建議您不要將此授權用作其反模式,它要求應用程序傳出違反OIDC整個想法的用戶憑證。這筆贈款大部分在這裏,用於遺產目的。

+0

也許我沒有解釋自己不夠好:我有一個服務,爲我的組織驗證用戶,基本上一個RESTful API。現在,從IdentityServer的UserService中,我需要調用它來在AuthenticateLocalAsync期間在IdSrvr中驗證用戶。 現在,我需要IdSrvr向自己發出一個令牌,以便將呼叫發送到身份驗證API,而_that_是我試圖弄清楚哪些應該是最好的/更清晰的部分。 當用戶登錄到應用程序時,資源所有者憑據授予被使用,但這是在服務之間(IdSrvr到授權api) – CesarD

+2

這種讓我想起IDS4中的這篇文章。說實話,我不知道天氣應該這樣做。 http://stackoverflow.com/questions/39981755/is-there-a-way-to-generate-an-access-token-from-within-identity-server-without-u 聽起來像你的用戶可以訪問在另一個web api中,但是這個應用程序是需要用戶信息的身份提供者的依賴方。基本上你需要一個來自UserService的有效令牌。說實話,我不會那麼肯定,如果這是乾淨的,但你必須做你應該做的。我認爲你的解決方案會很好。 – Lutando

+0

是的,這幾乎就像你發佈的問題和你解釋的方式。 是的,這是扭曲的,但那auth API是那裏,因爲它必須從AD和其他人事系統抓取用戶,並從兩個部分驗證用戶作爲一個整體...只有用戶憑證是正確的驗證和聲明與驗證結果一起返回(如果可以的話)...並且將IdSrvr中的所有邏輯都納入其中也沒什麼意義。 我會留下任何進一步的反饋問題。謝謝你的。 – CesarD