Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oauth 使用Azure Active Directory的MVC5应用程序+;RESTAPI——为PowerBI/O365进行身份验证_Oauth_Asp.net Identity_Azure Active Directory_Powerbi_Outlook Restapi - Fatal编程技术网

Oauth 使用Azure Active Directory的MVC5应用程序+;RESTAPI——为PowerBI/O365进行身份验证

Oauth 使用Azure Active Directory的MVC5应用程序+;RESTAPI——为PowerBI/O365进行身份验证,oauth,asp.net-identity,azure-active-directory,powerbi,outlook-restapi,Oauth,Asp.net Identity,Azure Active Directory,Powerbi,Outlook Restapi,我正在尝试调整此处所示的WebAPI示例,以便在MVC5中使用: 我有一个常规的基于AccountController的登录系统,但我还需要用户通过OAuth登录到PowerBI,这样我就可以通过PowerBIRESTAPI获取数据集。但是,我将ClaimsPrincipal.Current.FindFirst(..)设置为null private static async Task<string> getAccessToken() { // Cre

我正在尝试调整此处所示的WebAPI示例,以便在MVC5中使用:

我有一个常规的基于
AccountController
的登录系统,但我还需要用户通过OAuth登录到PowerBI,这样我就可以通过PowerBIRESTAPI获取数据集。但是,我将
ClaimsPrincipal.Current.FindFirst(..)
设置为
null

    private static async Task<string> getAccessToken()
    {
        // Create auth context (note: token is not cached)
        AuthenticationContext authContext = new AuthenticationContext(Settings.AzureADAuthority);

        // Create client credential
        var clientCredential = new ClientCredential(Settings.ClientId, Settings.Key);

        // Get user object id
        var userObjectId = ClaimsPrincipal.Current.FindFirst(Settings.ClaimTypeObjectIdentifier).Value;

        // Get access token for Power BI
        // Call Power BI APIs from Web API on behalf of a user
        return authContext.AcquireToken(Settings.PowerBIResourceId, clientCredential, new UserAssertion(userObjectId, UserIdentifierType.UniqueId.ToString())).AccessToken;
    }
private静态异步任务getAccessToken()
{
//创建身份验证上下文(注意:令牌未缓存)
AuthenticationContext authContext=新的AuthenticationContext(Settings.azureadaauthority);
//创建客户端凭据
var clientCredential=新的clientCredential(Settings.ClientId,Settings.Key);
//获取用户对象id
var userObjectId=ClaimsPrincipal.Current.FindFirst(Settings.ClaimTypeObjectIdentifier).Value;
//获取Power BI的访问令牌
//代表用户从Web API调用Power BI API
返回authContext.AcquireToken(Settings.PowerBIResourceId,clientCredential,new UserAssertion(userObjectId,UserIdentifierType.UniqueId.ToString()).AccessToken;
}
在示例应用程序(一个WebAPI项目)中,这一切都可以正常工作。我还在
Startup.Auth.cs
中配置了OWIN
app.UseOpenIdConnectAuthentication
功能

这似乎是我在“ClaimsPrincipal.Current”中唯一的一种声明类型,它是一种“CookieAuthentication”——它缺少声明


另外…Microsoft OAuth窗口从未在浏览器中打开…但是,错误在ActiveDirectory相关代码中…该代码首先不需要OAuth令牌,对吗?

建议这样做的方法是使用Open ID Connect中间件将自动为您检索的代码。这里有相关示例:

此示例使用OAuth获取AAD图形API的令牌。我不知道PowerBI,但我相信这与为PowerBI获取令牌完全类似

请特别注意此文件:

AuthorizationCodeReceived=(上下文)=>
{
var code=context.code;
ClientCredential=新的ClientCredential(clientId,appKey);
字符串userObjectID=context.AuthenticationTicket.Identity.FindFirst(“http://schemas.microsoft.com/identity/claims/objectidentifier1.价值;
AuthenticationContext authContext=新的AuthenticationContext(Authority,新的NaiveSessionCache(userObjectID));
AuthenticationResult=authContext.AcquireTokenByAuthorizationCode(代码,新Uri(HttpContext.Current.Request.Url.GetLeftPart(Uriplate.Path)),凭证,graphResourceId);
返回Task.FromResult(0);
},
上述代码在每次成功的身份验证时都会被调用,ADAL用于检索Graph API的令牌。此时,为Graph API获取令牌的唯一原因是将短期的身份验证代码交换为长期的刷新令牌,并获取存储在缓存中的令牌。这就是为什么从未使用“结果”

稍后,在以下文件中,缓存用于检索令牌并使用它访问图形:

string tenantId=ClaimsPrincipal.Current.FindFirst(TenantIdClaimType).Value;
字符串userObjectID=ClaimsPrincipal.Current.FindFirst(“http://schemas.microsoft.com/identity/claims/objectidentifier1.价值;
AuthenticationContext authContext=新的AuthenticationContext(Startup.Authority,new NaiveSessionCache(userObjectID));
ClientCredential=新的ClientCredential(clientId,appKey);
结果=authContext.AcquireTokenSilent(graphResourceId,凭证,新用户标识符(userObjectID,UserIdentifierType.UniqueId));
这一次实际使用了令牌

在示例中用PowerBI替换Graph API,我认为您应该可以开始了

请注意,另一件需要注意的事情是缓存实现。此文件包含一个适当的名称
NaiveSessionCache


如果您有多个前端,您将需要实现自己的、不太简单的会话缓存,以便所有前端都可以共享同一个缓存。

一个潜在的解决方法,至少对我来说,是在Azure AD上使用“本机应用”设置并遵循此工作流,而不是web app+oauth工作流:


感谢您提供了全面的答案-基于代码比较,似乎PowerBI也应该如此。只要我有时间,我会马上测试它&如果答案是这样的话,我会把它标记为答案(现在投票赞成)。临时使用了变通方法(请参见下面的答案)。再次感谢!