将凭据从Web App传递到Web API。 Azure AD身份验证

时间:2017-07-11 04:22:32

标签: c# asp.net azure azure-web-sites azure-active-directory

我有一个常规的ASP .NET Web应用程序,我使用 App Services 部署到Azure中。部署之后,我启用了App Service身份验证并配置了Azure Active Directory。这使我可以发布我的Web应用程序并进行身份验证,因此只有属于Active Directory的人才能登录。

enter image description here

另一方面,我将ASP .NET Web API部署为 Cloud Service 。 Web应用程序应该加载一些调用Web API的信息(从SQL数据库加载一些数据并将其返回),然后在UI中显示信息。但是,当我调用API时,Azure Active Directory凭据不会从Web App传递到Web API。

下面是我在Web应用程序中调用Web API端点的一些代码。

public string GetStringAsync(string endPoint)
{
    HttpClientHandler handler = new HttpClientHandler
    {
        UseDefaultCredentials = true
    };
    handler.PreAuthenticate = true;
    using (HttpClient client = new HttpClient(handler))
    {
        return client.GetStringAsync(endPoint).Result;
    }
}

但是当我在调用API时尝试获取用户名时,我得到一个空字符串。以下是我捕获调用API的身份的方法:

HttpContext.Current.User.Identity.Name;

如何在Web应用程序调用Web API时获取Azure Active Directory域\用户信息?可能我调用API的功能是完全错误的?

3 个答案:

答案 0 :(得分:2)

根据说明,您可以在Azure上部署Web应用程序并使用Azure AD保护Web应用程序。

AFAIK,在这种情况下,无法将凭据传递给Web API。相应的解决方案,您应该使用Azure AD保护Web API(我们可以使用保护Web应用程序的相同应用程序)并获取Web API的access_token。然后,Web APP可以使用access_token调用Web API。

要配置easy auth以获取Web API的令牌,您可以参考this blog(步骤2:通过REST API更新App Service Auth Configuration)并将资源值替换为您使用的应用的APP ID保护Web API。要从网络应用获取access_token,您可以关注该博客的调用图谱API作为最终用户部分。

答案 1 :(得分:0)

1-从Web应用程序中读取.ASPX身份验证cookie

HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
string authToken = authCookie.Value;

2-将cookie设置为httpclient。 cookie值必须具有相同的.ASPX身份验证cookie。

How do I set a cookie on HttpClient's HttpRequestMessage

3-使用HttpContext.Current.User.Identity.Name从web api读取用户名。

希望这有帮助。

答案 2 :(得分:0)

[Authorize]
public IEnumerable<Object> Get()
{
 var owner = ObtainCurrentOwner();
 var assets = GetAssets(owner.Id);
 return result;
}

protected Owner ObtainCurrentOwner()
{
 return RavenSession.Query<Owner>().SingleOrDefault(x => 
           x.UserName == HttpContext.Current.User.Identity.Name);
}

public IEnumerable<Asset> GetAssets(int ownerID)
{
 return RavenSession.Query<Asset>().Where(x => x.OwnerId == ownerID);
}

此方法使用[Authorize]属性修饰。此机制以前在WCF中已知。 ASP.NET检查此请求中的cookie,如果没有cookie,则拒绝该请求。获取当前用户及其所有资产只需使用必须在之前打开的RavenSession进行两次LINQ查询。

https://www.codeproject.com/Articles/568115/Sample-application-RavenDB-KnockoutJS-Bootstrap-We