簡體   English   中英

如何將授權令牌從一個WebAPI傳遞到另一WebAPI?

[英]How to pass Authorization token from one webapi to other webapi?

我已經在Azure AD中配置了兩個applications 一個是稱為app-A的Web API,另一個是稱為app-B的Web API。

如何使用客戶端憑據令牌在app-A處生成令牌並將該令牌傳遞給app-B

如果我的問題理解正確,那么您要將授權令牌從一個Web API服務轉發到另一個Web API?

這是我的方法:

  • 創建請求上下文中存在的會話上下文。 這是通過使用Unity和HierarchicalLifetimeManager
  • app-a的請求中提取所有標頭,並將其放入會話上下文中
  • 在調用app-b之前,使用HttpClient插入cookie。

如果需要,也可以只提取令牌而不是提取所有cookie。

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;
    }
}

Cookie提取器

/// <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);
    }
}

Unity配置

// 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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM