C# 为web api创建编程登录
我试图在.net core 2.0中的控制器内使用HttpContext.SignInAsync登录 下面是我在.NETCore1.1中使用的同一个控制器,它工作得很好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
[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);