我正在尝试构建一个非常简单的游乐场服务器来研究一些 ASP.NET Core 身份验证/授权概念。基本上是一个带有一个非常简单的控制器的网络应用程序,可以用 Postman 进行测试。
我想出了我的代码的缩小版本,由一个登录端点组成,该端点将使用 Cookie 身份验证对用户进行身份验证(不需要凭据),如下所示:
[ApiController]
public class MyController : ControllerBase
{
[HttpGet("/login")]
public async Task<IActionResult> Login()
{
var claims = new[] { new Claim("name", "bob") };
var identity = new ClaimsIdentity(claims);
var principal = new ClaimsPrincipal(identity);
await HttpContext.SignInAsync(principal);
return Ok();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是调用HttpContext.SignInAsync()正在触发以下异常:
System.InvalidOperationException: SignInAsync when principal.Identity.IsAuthenticated is false is not allowed when AuthenticationOptions.RequireAuthenticatedSignIn is true.
at Microsoft.AspNetCore.Authentication.AuthenticationService.SignInAsync(HttpContext context, String scheme, ClaimsPrincipal principal, AuthenticationProperties properties)
at MyController.Login() in C:\Users\vinic\Desktop\TEMP\TestesAuthorization\Controllers\MyController.cs:line 18
Run Code Online (Sandbox Code Playgroud)
然后我尝试HttpContext.SignInAsync()通过调用来替换 …
我目前正在构建一个支持 ASP.NET Core 项目开发的工具。此工具使用 Roslyn API 和其他方法来验证某些开发要求(例如应用到 API 控制器上的项目特定属性、强制执行命名约定以及为访问使用 ASP.NET 编写的 API 的 JavaScript SPA 生成一些源代码核心 Web API 模板)。
为此,我目前正在使用硬编码路径为 SPA 应用程序生成代码。但是在应用程序的*.csproj文件中,实际上有一个“SpaRoot”属性指定了 SPA 应用程序在项目中的位置:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
<TypeScriptToolsVersion>Latest</TypeScriptToolsVersion>
<IsPackable>false</IsPackable>
<SpaRoot>ClientApp\</SpaRoot>
...
</PropertyGroup>
...
</Project>
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何使用 Roslyn API 读取“SpaRoot”属性的值?
我编写了一个最小代码示例来创建Workspace、打开Solution和检索Project的引用,它类似于以下内容:
static async Task Main(string[] args)
{
string solutionFile = @"C:\Test\my-solution.sln";
using (var workspace = MSBuildWorkspace.Create())
{
var solution = await workspace.OpenSolutionAsync(solutionFile);
string projectName = "some-project";
var project = solution.Projects.Single(p => …Run Code Online (Sandbox Code Playgroud)