如何使用我的ASP.NET核心站点中的身份验证来验证angular 2 web应用程序?

时间:2016-06-19 15:25:43

标签: authentication cookies angular asp.net-core asp.net-core-mvc

我有带有角度2前端的ASP.NET Core应用程序。我使用cookie auth。 但我想将我的应用程序分成两个独立的站点 - 一个在angular2上的前端站点和一个在asp.net核心上的后端站点。

如何使用ASP.NET Core站点的auth验证前端应用程序? 我的后端网站上有一个登录页面。如何在前端应用程序中识别出我未经过身份验证,然后重定向到后端应用程序然后获取身份验证Cookie?我不确定我理解这个过程的机制。

2 个答案:

答案 0 :(得分:4)

我使用基于令牌的身份验证。我选择了这个解决方案:https://stormpath.com/blog/token-authentication-asp-net-core& https://github.com/nbarbettini/SimpleTokenProvider

答案 1 :(得分:1)

对于身份验证,我更喜欢使用Cookie。

Use cookie authentication without Identity

登录代码

[HttpPost("login")]
[AllowAnonymous]
public async Task<HttpBaseResult> Login([FromBody]LoginDto dto)
{
    var user = db.Users.Include(u=>u.UserRoles).SingleOrDefault();
    var claims = new List<Claim>
    {
        new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
            new Claim(ClaimTypes.Name, user.UserName)
    };
    var roles = user.UserRoles.Select(u => u.Role);
    foreach (var item in roles)
    {
        claims.Add(new Claim(ClaimTypes.Role, item.Name));
    }
    var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
    await HttpContext.SignInAsync(
        new ClaimsPrincipal(identity),
        new AuthenticationProperties { IsPersistent = dto.RememberMe });
    // ...
}

跨域

ConfigureServices

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options =>
{
    options.SlidingExpiration = true;
    options.Cookie.HttpOnly = false;
    // Dynamically set the domain name of the prod env and dev env
    options.Cookie.Domain = Configuration["CookieDomain"];
});

配置

app.UseCors(builder => builder.WithOrigins("http://localhost:4200", "http://www.example.com","http://example.com")
    .AllowAnyMethod()
    .AllowAnyHeader()
    .AllowCredentials());

Angular Code

public login(userName: string, password: string, rememberMe: boolean): Observable<HttpBaseResult> {
  const url: string = `${this.url}/login`;
  var data = {
    UserName: userName,
    Password: password,
    RememberMe: rememberMe
  };
  return this.client.post<HttpBaseResult>(url, data, { withCredentials: true });
}