Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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
C# Azure身份验证服务在发布后不工作_C#_.net_Azure_Asp.net Web Api2_Microsoft Graph Api - Fatal编程技术网

C# Azure身份验证服务在发布后不工作

C# Azure身份验证服务在发布后不工作,c#,.net,azure,asp.net-web-api2,microsoft-graph-api,C#,.net,Azure,Asp.net Web Api2,Microsoft Graph Api,我有一个.NETWebAPI,在这里我为SPA提供了一个端点来获取Azure oAuth 2访问令牌。当我在本地运行web api时,服务工作正常。但是,当我将服务发布到MS Azure时,端点返回我{“消息”:“发生了错误”。}。仅当我要验证用户身份时才会引发此错误。如果使用客户机密码为客户机身份验证运行相同的代码,则正确返回访问令牌 我的问题是,为什么这只发生在azure上,我如何修复它 用户身份验证(不在Azure上工作) 资源是例如:“” 公共字符串获取([FromUri]字符串资源)

我有一个.NETWebAPI,在这里我为SPA提供了一个端点来获取Azure oAuth 2访问令牌。当我在本地运行web api时,服务工作正常。但是,当我将服务发布到MS Azure时,端点返回我{“消息”:“发生了错误”。}。仅当我要验证用户身份时才会引发此错误。如果使用客户机密码为客户机身份验证运行相同的代码,则正确返回访问令牌

我的问题是,为什么这只发生在azure上,我如何修复它

用户身份验证(不在Azure上工作)

资源是例如:“”

公共字符串获取([FromUri]字符串资源)
{
var token=GetAuthenticatedUserAsync(资源).Result;
返回token.AccessToken;
}
//用户身份验证
[DisableCors()]
私有静态异步任务GetAuthenticatedUserAsync(字符串资源)
{
AuthenticationContext authContext=新的AuthenticationContext(“https://login.microsoftonline.com/{tenant}/oauth2/authorize”);
返回wait authContext.AcquireTokenAsync(resource,ConfigurationManager.AppSettings[“UserClientId”]、新Uri(“{redirect url}”)、新平台参数(PromptBehavior.Auto)).ConfigureWait(false);
}
客户端身份验证(在Azure上工作)

//客户端的身份验证
[DisableCors()]
公共静态异步任务GetAuthenticatedAppAsync()
{
AuthenticationContext authContext=新的AuthenticationContext(“https://login.microsoftonline.com/{tenant}/oauth2/authorize”);
var credentials=new Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential(ConfigurationManager.AppSettings[“AppClientId”]、ConfigurationManager.AppSettings[“AppClientSecret”]);
返回wait authContext.AcquireTokenAsync(ConfigurationManager.AppSettings[“GraphResource”],凭据)。ConfigureWait(false);
}
我的问题是,为什么这只发生在azure上,我如何修复它

正如juunas提到的,我们不能在Azure WebApp上使用PromptBehavior.Auto方式

似乎,提示行为是一种GDI+行为。就像WebApp一样。Azure Web应用程序中不允许使用此选项


如果您想在Azure应用程序服务中对用户进行端到端的身份验证和授权,请参阅此项和此项。

如果这是后端服务,则不能对
PromptBehavior.Auto使用重载。您需要获取SPA发送的访问令牌,并使用“代表流”将其交换为访问令牌。@juunas谢谢。为什么它可以在本地主机上工作而不能在azure上工作?这实际上是一个很好的问题:)我不确定
public string Get([FromUri] String resource)
        {
            var token = GetAuthenticatedUserAsync(resource).Result;
            return token.AccessToken;
        }
//Authentication of an user
[DisableCors()]
private static async Task<Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationResult> GetAuthenticatedUserAsync(String resource)
        {
                AuthenticationContext authContext = new AuthenticationContext("https://login.microsoftonline.com/{tenant}/oauth2/authorize");
                return await authContext.AcquireTokenAsync(resource, ConfigurationManager.AppSettings["UserClientId"], new Uri("{redirect url}"), new PlatformParameters(PromptBehavior.Auto)).ConfigureAwait(false);
        }
//Authentication of a client
[DisableCors()]
public static async Task<Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationResult> GetAuthenticatedAppAsync() 
{
  AuthenticationContext authContext = new AuthenticationContext("https://login.microsoftonline.com/{tenant}/oauth2/authorize");
  var credentials = new Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential(ConfigurationManager.AppSettings["AppClientId"], ConfigurationManager.AppSettings["AppClientSecret"]);
  return await authContext.AcquireTokenAsync(ConfigurationManager.AppSettings["GraphResource"], credentials).ConfigureAwait(false);    
}