C# 为web api创建编程登录

C# 为web api创建编程登录,c#,asp.net-web-api,async-await,claims-based-identity,asp.net-core-2.0,C#,Asp.net Web Api,Async Await,Claims Based Identity,Asp.net Core 2.0,我试图在.net core 2.0中的控制器内使用HttpContext.SignInAsync登录 下面是我在.NETCore1.1中使用的同一个控制器,它工作得很好 [Route("Login/{username}")] public async Task<IActionResult> Login(string username) { var userClaims = new List<Claim> { new

我试图在.net core 2.0中的控制器内使用HttpContext.SignInAsync登录 下面是我在.NETCore1.1中使用的同一个控制器,它工作得很好

[Route("Login/{username}")]
public async Task<IActionResult> Login(string username)
{
        var userClaims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, username),
            new Claim(ClaimTypes.Role, "custom")
        };

        var principal = new ClaimsPrincipal(new ClaimsIdentity(userClaims, "local"));
        await HttpContext.SignInAsync("DefaultAuthenticationScheme", principal);
        return Ok("done");
}
在配置中:

app.UseAuthentication();

我还试图创建一个过滤器,可以做同样的登录。但是,由于我将重写过滤器函数,因此无法将其设置为异步函数,因此无法调用此异步函数上的wait

您应该将
Authorize
属性添加到您想要的控制器/方法,如果未经身份验证/授权,则重定向到登录

更新

如果您在
ConfigureServices
方法中添加此项,并替换您现有的内容,我就可以使用它:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCookie(o => o.LoginPath = new PathString("/Login"));

误解了这个概念,因为
AddAuthentication
函数包含一个字符串,该字符串将是我设置的配置的自定义名称。此名称稍后可用于引用
SignInAsync
功能中的配置。 多亏了@Mihali的答案中的提示,通过一些尝试和错误,我了解了它们的实际工作原理

首先,
SignInAsync
函数接受一个引用方案的字符串。例如,如果我想要存储cookies的默认方案,我可以使用如下“cookies”:

await HttpContext.SignInAsync("Cookies", principal);
或者,代替“Cookies”,我们可以始终使用存储字符串
CookieAuthenticationDefaults.AuthenticationScheme
的常量,如@Mihali提供的

AddAuthentication
函数中的字符串参数将被设置为默认方案。此默认方案可直接用于
SignInAsync
(如上)和
SignOutAsync
等功能。因此,我可以使用如下默认方案设置启动配置:

services.AddAuthentication("Cookies")
        .AddCookie();
在这种情况下,我不必每次使用登录和注销功能时都明确提到“Cookies”。我可以简单地使用:

await HttpContext.SignInAsync(principal);

这将使用startup.cs中设置的默认方案。

是的,我知道。我在另一个函数中也做了同样的测试。我似乎在这方面也有问题。无论哪种方式,我都试图先解决这个问题。我已经在调试器中测试了这个函数,但它没有登录。关于重定向代码。我不会使用它,因为我正在创建一个web api。我只需要
授权
返回400或403 not redirect。代码的第一部分kindda帮助解决这个问题。我正在研究确切的概念,我会更新它。我刚刚意识到我没有看到任何异步输出的原因。要检查错误,我们可以获取任务
var task=HttpContext.SignInAsync(principal)
的值,然后使用
task.Status
检查错误,然后检查
task.Exception下的异常列表
await HttpContext.SignInAsync(principal);