2016-10-07 8 views
0

私はAzure ADに2つのapplicationsを設定しました。 1つはapp-Aと呼ばれるWeb APIで、も​​う1つはapp-BというWeb APIです。 1つのwebapiから他のwebapiに認可トークンを渡す方法?

は、どのように私は、クライアントの資格情報を使用して app-Aでトークンを生成するトークン と app-Bにそのトークンを渡しますか?

答えて

1

あなたの質問が正しいとすれば、認可トークンをあるWeb APIサービスから別のWeb APIに転送しますか?

これは、私はそれをやった方法です:

  • 要求コンテキスト内に存在するセッションのコンテキストを作成します。これは、UnityとHierarchicalLifetimeManagerを使用して行います。
  • app-aでリクエストからすべてのヘッダを抽出し、app-bを呼び出す前にクッキーを挿入するHttpClientを使用したセッションコンテキスト
  • にそれを置きます。

また、すべてのクッキーの代わりにトークンのみを抽出することもできます。

のSessionContext

public class SessionContext 
{ 
    public string Token { get; private set; } 
    public CookieHeaderValue Cookies { get; private set; } 
    public void SetToken(string token) 
    { 
     if(Token != null) 
      throw new InvalidOperationException("Token is already set in this session."); 

     Token = token; 
    } 

    public void SetCookies(CookieHeaderValue cookies) 
    { 
     if (Cookies != null) 
      throw new InvalidOperationException("Cookies is already set in this session."); 
     Cookies = cookies; 
    } 
} 

CookieFetcher

/// <summary> ActionFilter to extract all cookie and add it to the <see cref="SessionContext"/>. </summary> 
public class CookieFetcherAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     var cookies = actionContext.Request.Headers.GetCookies().SingleOrDefault(); 

     if (cookies == null) 
      return; 

     var sessionContext = actionContext.Request.GetDependencyScope().GetService<SessionContext>(); 
     sessionContext.SetCookies(cookies); 
    } 
} 

ユニティ設定

// Gets a new TokenProvider per request 
container.RegisterType<SessionContext>(new HierarchicalLifetimeManager()); 

クライアント

public class Client 
{ 
    private CookieHeaderValue Cookies => sessionContext.Cookies; 

    public Client(SessionContext sessionContext) 
    { 
     this.sessionContext = sessionContext; 
    } 

    private HttpClient CreateHttpClient() 
    { 
     // If cookie/sessionId based authentication is used. 
     if (Cookies != null) 
     { 
      handler.CookieContainer = ConvertToCookieContainer(Cookies, baseUri.GetRootHostName()); 
      handler.UseCookies = true; 
     } 

     var client = new HttpClient(handler, true); 
     client.BaseAddress = baseUri; 

     return client; 
    } 

    private static CookieContainer ConvertToCookieContainer(CookieHeaderValue cookies, string cookiePath) 
    { 
     var container = new CookieContainer(); 
     foreach (var cookie in cookies.Cookies) 
     { 
      container.Add(new Cookie(cookie.Name, cookie.Value, "/", cookiePath)); 
     } 
     return container; 
    } 
} 
関連する問題