0
私はAzure ADに2つのapplications
を設定しました。 1つはapp-A
と呼ばれるWeb APIで、もう1つはapp-B
というWeb APIです。 1つのwebapiから他のwebapiに認可トークンを渡す方法?
は、どのように私は、クライアントの資格情報を使用してapp-A
でトークンを生成するトークン とapp-B
にそのトークンを渡しますか?
私はAzure ADに2つのapplications
を設定しました。 1つはapp-A
と呼ばれるWeb APIで、もう1つはapp-B
というWeb APIです。 1つのwebapiから他のwebapiに認可トークンを渡す方法?
は、どのように私は、クライアントの資格情報を使用してapp-A
でトークンを生成するトークン とapp-B
にそのトークンを渡しますか?
あなたの質問が正しいとすれば、認可トークンをあるWeb APIサービスから別のWeb APIに転送しますか?
これは、私はそれをやった方法です:
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;
}
}