Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.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# 从ASP.NET核心Web API中的控制器访问用户标识_C#_Azure_Asp.net Web Api_Asp.net Core - Fatal编程技术网

C# 从ASP.NET核心Web API中的控制器访问用户标识

C# 从ASP.NET核心Web API中的控制器访问用户标识,c#,azure,asp.net-web-api,asp.net-core,C#,Azure,Asp.net Web Api,Asp.net Core,根据本文件: 我应该能够使用ControllerBase.user或HttpContext.user访问用户标识 根据上面的链接: “从应用程序的DI服务集合获取当前用户的身份也更容易测试,因为测试身份可以很容易地注入。” 据我所知,我应该在Startup.cs或控制器的构造函数中使用依赖项注入来注入标识信息 然而,经过长时间的调查,我无法找到程序 以下步骤描述了我的场景。我希望有人能指引我正确的方向 1) 使用Visual Studio 2017,使用以下选项创建ASPNET.core We

根据本文件:

我应该能够使用ControllerBase.user或HttpContext.user访问用户标识

根据上面的链接:

“从应用程序的DI服务集合获取当前用户的身份也更容易测试,因为测试身份可以很容易地注入。”

据我所知,我应该在Startup.cs或控制器的构造函数中使用依赖项注入来注入标识信息

然而,经过长时间的调查,我无法找到程序

以下步骤描述了我的场景。我希望有人能指引我正确的方向

1) 使用Visual Studio 2017,使用以下选项创建ASPNET.core Web API项目:

  • 类型:API
  • 启用Docker支持:否
  • 身份验证:无身份验证
  • 为HTTPS配置:是
2) 使用以下代码将AuthDetailsController.cs添加到控制器文件夹:

using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace CoreWebApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AuthDetailsController : Controller
    {


        [HttpGet]
        public JsonResult Get()
        {
            var r = new Dictionary<String, Object>();

            r.Add("User.Identities", User.Identities);
            r.Add("User.Claims", User.Claims);
            r.Add("HttpContext.User.Identities", HttpContext.User.Identities);
            r.Add("HttpContext.User.Claims", HttpContext.User.Claims);

            return Json(r );
        }

    }
}
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;

namespace CoreWebApiTest2.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AuthDetailsController : ControllerBase
    {
        // GET: api/AuthDetails
        [HttpGet]
        public Dictionary<string,string> Get()
        {
            return new Dictionary<string, string> { {"X-MS-CLIENT-PRINCIPAL-NAME", Request.Headers["X-MS-CLIENT-PRINCIPAL-NAME"] },
                                                    {"X-MS-CLIENT-PRINCIPAL-ID", Request.Headers["X-MS-CLIENT-PRINCIPAL-ID"]  } };

        }
    }
}
6) 使用以下选项启用Azure身份验证:

  • 请求未通过身份验证时要采取的操作:使用Azure Active Directory登录
  • Azure Active directory配置:快速模式
7) 重新打开

8) 您将被重定向到登录页面


9) 成功登录后,ControllerBase.User和HttpContext.User中都没有标识信息。响应与启用身份验证之前相同

您必须告诉startup.cs中需要使用的身份验证

大概是这样

services.AddAuthentication(IISDefaults.AuthenticationScheme);
有关此详细信息的链接,请访问

此外,对于控制器中的操作,您需要添加[授权]。只有在添加此项后,您才能检索详细信息。如果在控制器级别添加,对于不需要身份验证的操作,可以添加[AllowAnonymous]

[HttpGet]
[Authorize]
        public JsonResult Get()
        {
            var r = new Dictionary<String, Object>();

            r.Add("User.Identities", User.Identities);
            r.Add("User.Claims", User.Claims);
            r.Add("HttpContext.User.Identities", HttpContext.User.Identities);
            r.Add("HttpContext.User.Claims", HttpContext.User.Claims);

            return Json(r );
        }
[HttpGet]
[授权]
publicjsonresult Get()
{
var r=新字典();
r、 添加(“User.identies”,User.identies);
r、 添加(“User.Claims”,User.Claims);
r、 添加(“HttpContext.User.identifications”,HttpContext.User.identifications);
r、 添加(“HttpContext.User.Claims”,HttpContext.User.Claims);
返回Json(r);
}
此示例适用于:

我可以通过以下方式识别控制器中的用户:

User.FindAll("preferred_username").First().Value;
这是一个不同的项目类型。这是一个MVC网站,而不是API项目

这不完全是我想要的,但至少它是有效的。 我将研究如何将此应用于我的API项目。

我成功了

这为我指明了正确的方向

以下是重现我的场景的步骤:

1) 使用Visual Studio 2017,使用以下选项创建ASPNET.core Web API项目:

  • 类型:API
  • 启用Docker支持:否
  • 身份验证:无身份验证
  • 为HTTPS配置:是
2) 使用以下代码将AuthDetailsController.cs添加到控制器文件夹:

using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace CoreWebApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AuthDetailsController : Controller
    {


        [HttpGet]
        public JsonResult Get()
        {
            var r = new Dictionary<String, Object>();

            r.Add("User.Identities", User.Identities);
            r.Add("User.Claims", User.Claims);
            r.Add("HttpContext.User.Identities", HttpContext.User.Identities);
            r.Add("HttpContext.User.Claims", HttpContext.User.Claims);

            return Json(r );
        }

    }
}
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;

namespace CoreWebApiTest2.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AuthDetailsController : ControllerBase
    {
        // GET: api/AuthDetails
        [HttpGet]
        public Dictionary<string,string> Get()
        {
            return new Dictionary<string, string> { {"X-MS-CLIENT-PRINCIPAL-NAME", Request.Headers["X-MS-CLIENT-PRINCIPAL-NAME"] },
                                                    {"X-MS-CLIENT-PRINCIPAL-ID", Request.Headers["X-MS-CLIENT-PRINCIPAL-ID"]  } };

        }
    }
}

更改后,我得到异常:InvalidOperationException:未指定任何authenticationScheme,并且在您的startup.cs文件后未找到DefaultChallengeScheme-这是需要更改的地方。您可能缺少cookie设置。Cookies是存储用户信息的地方。请参见此处,了解如何为应用程序设置cookies:比较工作项目和非工作项目的startup.cs文件。你应该在那里找到你的答案。