我目前正在开发一个我不使用Identity的项目。
事情是这个项目应该有一个记住我选项,允许用户自动重新连接到网站。
我的问题是我找不到任何完整的教师来创建没有身份的cookie。
如果某人有一个很好的代码或tutoial样本:)
谢谢
答案 0 :(得分:3)
在我的项目中,我使用AngularJS作为Frontend和.Net Core API for Backend。
因此,我不需要为AccessDeniedPath
,LoginPath
等配置页面。
这就是我的所作所为:
在启动类中配置cookie:
public void Configure(IApplicationBuilder app) {
//...
CookieAuthenticationOptions options = new CookieAuthenticationOptions();
options.AuthenticationScheme = "MyCookie";
options.AutomaticAuthenticate = true;
options.CookieName = "MyCookie";
app.UseCookieAuthentication(options);
//...
}
登录是这样的:
[HttpPost, Route("Login")]
public IActionResult LogIn([FromBody]LoginModel login) {
//...
var identity = new ClaimsIdentity("MyCookie");
//add the login as the name of the user
identity.AddClaim(new Claim(ClaimTypes.Name, login.Login));
//add a list of roles
foreach (Role r in someList.Roles) {
identity.AddClaim(new Claim(ClaimTypes.Role, r.Name));
}
var principal = new ClaimsPrincipal(identity);
HttpContext.Authentication.SignInAsync("MyCookie", principal).Wait();
return Ok();
}
退出是这样的:
[HttpPost, Route("Logout")]
public async Task<IActionResult> LogOut() {
await HttpContext.Authentication.SignOutAsync("MyCookie");
return Ok();
}
然后你可以像这样使用它:
[HttpPost]
[Authorize(Roles = "Role1,Role2,Role3")]
public IActionResult Post() {
//...
string userName = this.User.Identity.Name;
//...
}
*请参阅该方法仅被授权用于&#34; Role1,Role2和Role3&#34;。并了解如何获取用户名。
答案 1 :(得分:1)
我认为你问的是当用户使用&#34;记住我时,如何制作持久性cookie?&#34;选中复选框。
所有答案都在正确的路径上 - 您最终会调用Arrays.stream(array)
.collect(Collectors.groupingBy(Function.identity(),
LinkedHashMap::new,
Collectors.counting()))
.entrySet()
.forEach(e -> System.out.println(e.getValue() +
"\t" +
e.getKey() +
(e.getValue() > 1 ? "s" : "")));
,但Cookie中间件默认会发出会话Cookie。您需要将身份验证属性作为第三个参数传递,以使Cookie持久,例如:
HttpContext.Authentication.SignInAsync
答案 2 :(得分:0)
这里有一篇非常好的文章:Using Cookie Middleware without ASP.NET Core Identity。
基本上你所做的就是设置cookie处理中间件,好像你要识别用户,但是你只需要创建一个ClaimsPrincipal对象而不要求用户登录。您将该对象传递给SigninAsync方法,它会为您创建cookie。如果你遵循这篇文章,你应该没事。