2016-08-04 58 views
2

這可能是一個愚蠢的問題,但在這裏不用:)我如何向身份服務器本身發出訪問令牌?

我在這個問題以下應用:

  • 的IdentityServer3
  • 一個WebApi2應用程序,它使用Identityserver作爲其認證
  • MVC網絡應用程序

我想要做的是從身份服務器調用WebApi上的安全服務,但在爲了做到這一點,我需要一個訪問令牌。

我如何IdentityServer問題內的訪問令牌本身(爲了將通過自身從的WebAPI被認證)

回答

1

我有相同或非常相似的要求。在我的情況下,用戶請求令牌並使用外部IdP進行驗證(這是使用授權碼流)。在用戶身份驗證過程之後,我需要IdentityServer聯繫受保護的WebApi - 並且這樣做IdentityServer需要令牌(使用客戶端憑據流)

我目前的解決方案(但我仍在測試)是在AutenticateExternalAsync在自定義用戶服務上。在這裏,我使用TokenClient.RequestClientCredentialsAsync進行調用。顯然,客戶端需要爲IdentityServer本身設置。

早期跡象表明,這可以在開發環境中按預期工作。

0

我遵循@Andy的建議,它爲我工作:)發佈我的代碼在這裏讓其他人看到。以下代碼在自定義用戶服務中實現。

public override Task AuthenticateLocalAsync(LocalAuthenticationContext context) 
    { 
     var user = GetUsersAsync().SingleOrDefault(x => x.Username == context.UserName && x.Password == context.Password); 
     if (user != null) 
     { 
      context.AuthenticateResult = new AuthenticateResult(user.Subject, user.Username); 
     } 

     return Task.FromResult(0); 
    } 

    private static List<CustomUser> GetUsersAsync() 
    { 

     var response = GetTokenAsync(); 

     var result = CallUserApi(response.Result.AccessToken).Result; 
     var users = JsonConvert.DeserializeObject<List<CustomUser>>(result); 

     return users; 
    } 


    private static Task<string> CallUserApi(string token) 
    { 
     var client = new HttpClient(); 
     client.SetBearerToken(token); 

     var json = client.GetStringAsync($"https://your.apiAdress.here/"); 
     return json; 
    } 

    private static Task<IdentityModel.Client.TokenResponse> GetTokenAsync() 
    { 
     var client = new TokenClient(
      "https://identityserver.adress.here/identity/connect/token", 
      "clientId", 
      "secret"); 

     return client.RequestClientCredentialsAsync("apiScope"); 

    } 
相關問題