Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.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从存储在数据库中的电子邮件/密码中运行OAuth2?_C#_Azure_Authentication_Oauth 2.0_Azure Functions - Fatal编程技术网

C# Azure从存储在数据库中的电子邮件/密码中运行OAuth2?

C# Azure从存储在数据库中的电子邮件/密码中运行OAuth2?,c#,azure,authentication,oauth-2.0,azure-functions,C#,Azure,Authentication,Oauth 2.0,Azure Functions,我有一个包含电子邮件和密码哈希的数据库 我想保护Azure函数中的http触发器,以仅允许授权调用,这要感谢带有承载令牌的授权头 我想我需要 将从电子邮件/密码生成令牌的http触发器 基于授权标头对用户进行授权和身份验证 有人能告诉我如何创建自定义身份验证提供程序或使用现有的身份验证提供程序并配置Azure功能来使用它吗?Microsoft identity platform支持此授权,它允许应用程序通过直接处理用户的密码来登录用户 从数据库获取电子邮件(用户名)和密码,并发送以下请求以接收访

我有一个包含电子邮件和密码哈希的数据库

我想保护Azure函数中的http触发器,以仅允许授权调用,这要感谢带有承载令牌的授权头

我想我需要

  • 将从电子邮件/密码生成令牌的http触发器
  • 基于授权标头对用户进行授权和身份验证

  • 有人能告诉我如何创建自定义身份验证提供程序或使用现有的身份验证提供程序并配置Azure功能来使用它吗?

    Microsoft identity platform支持此授权,它允许应用程序通过直接处理用户的密码来登录用户

    从数据库获取电子邮件(用户名)和密码,并发送以下请求以接收访问令牌

    POST {tenant}/oauth2/v2.0/token
    Host: login.microsoftonline.com
    Content-Type: application/x-www-form-urlencoded
    
    client_id=6731de76-14a6-49ae-97bc-6eba6914391e
    &scope=user.read%20openid%20profile%20offline_access
    &username=MyUsername@myTenant.com
    &password=SuperS3cret
    &grant_type=password
    

    您可以查看以下代码片段,我已经在azure portal上进行了测试,
    azure Function V2

    #r“Newtonsoft.Json”
    使用Newtonsoft.Json;
    Net系统;
    使用System.Net.Http.Header;
    公共静态异步任务运行(HttpRequestMessage请求、TraceWriter日志)
    {
    尝试
    {
    //解析查询参数
    LogInformation(“C#HTTP触发器函数处理了一个请求。”);
    //读取请求正文
    var content=wait new StreamReader(req.Body).ReadToEndAsync();
    //提取请求主体并解析到类
    UserAuthentication objUserInfo=JsonConvert.DeserializeObject(内容);
    //消息容器
    动态验证消息;
    //验证所需参数
    if(string.IsNullOrEmpty(objUserInfo.UserName.Trim()))
    {
    validationMessage=new OkObjectResult(“需要用户名!”);
    返回(IActionResult)验证消息;
    }
    if(string.IsNullOrEmpty(objUserInfo.Password.Trim()))
    {
    validationMessage=new OkObjectResult(“需要密码!”);
    返回(IActionResult)验证消息;
    }
    //身份验证令牌请求格式
    字符串标记URL=$”https://login.microsoftonline.com/common/oauth2/token";
    var tokenRequest=newhttprequestmessage(HttpMethod.Post,tokenUrl);
    tokenRequest.Content=newformurlencodedcontent(新字典
    {
    [“授权类型”]=“密码”,
    [“客户端id”]=“您的应用程序id”,
    [“客户端密码”]=“您的应用程序密码”,
    [“资源”]=”https://graph.microsoft.com",
    [“用户名”]=“”+objUserInfo.username+“”,
    [“密码”]=“”+objUserInfo.password+“”
    });
    //请求令牌终结点
    使用(var _client=new HttpClient())
    {
    var tokenResponse=wait_client.SendAsync(tokenRequest);
    AccessTokenClass objAccessToken=JsonConvert.DeserializeObject(等待tokenResponse.Content.ReadAsStringAsync());
    //当令牌请求为空时
    if(objAccessToken.accessu token==null)
    {
    validationMessage=new OkObjectResult(“身份验证无效!请检查您的凭据并重试!”);
    返回(IActionResult)验证消息;
    }
    其他的
    {
    返回新的OkObjectResult(objAccessToken.access_token);
    }
    }
    }
    捕获(例外情况除外)
    {
    validationMessage=new-OkObjectResult(“很抱歉出现了问题!请检查您提供的信息并重试!{0}”+ex.Message);
    返回(IActionResult)验证消息;
    }
    }
    
    我使用过的类:
    UserAuthentication类

    公共类用户身份验证
    {
    公共字符串用户名{get;set;}
    公共字符串密码{get;set;}
    }
    
    公共类AzureFunctionCreateUserClass
    {
    公共字符串访问\u令牌{get;set;}
    {get;set;}中的公共字符串过期
    公共字符串标记\u类型{get;set;}
    公共字符串资源{get;set;}
    }
    
    注意:这是我在azure函数上编写的azure门户示例。所以试着在那里跑


    希望这会有所帮助

    你需要C#代码示例进行身份验证吗?是的.NET Core C#您好,谢谢您的帮助,我认为所有用户都必须存在于microsoft平台上才能使其正常工作?是的,他们是azure ad中的用户,因此可以进行身份验证。