【问题标题】:How to pass Authorization token from one webapi to other webapi?如何将授权令牌从一个 webapi 传递到另一个 webapi?
【发布时间】:2017-02-16 08:27:06
【问题描述】:

我在 Azure AD 中配置了两个 applications。一种是称为app-A 的Web API,另一种是称为app-B 的Web API。

如何使用客户端凭据令牌在 app-A 生成令牌 并将该令牌传递给app-B?

【问题讨论】:

    标签: azure asp.net-web-api asp.net-web-api2


    【解决方案1】:

    如果我理解您的问题正确,您想将授权令牌从一个 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;
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 2019-11-11
      • 2011-07-29
      相关资源
      最近更新 更多