要在Asp.Net Core 2.1和Angular之间共享会话,你可以使用JWT(JSON Web Token)来实现。以下是一个基本的解决方案,其中包含代码示例:
// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
// 注册JWT身份验证
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "your_issuer",
ValidAudience = "your_audience",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key"))
};
});
// 其他服务注册...
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// 启用身份验证中间件
app.UseAuthentication();
// 其他中间件配置...
}
// AccountController.cs
[HttpPost("login")]
public IActionResult Login([FromBody]LoginModel model)
{
// 验证用户名和密码
// ...
// 生成JWT令牌
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes("your_secret_key");
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.Name, user.Id.ToString()),
// 其他声明...
}),
Expires = DateTime.UtcNow.AddDays(7),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
var tokenString = tokenHandler.WriteToken(token);
return Ok(new { Token = tokenString });
}
// app.module.ts
import { NgModule } from '@angular/core';
import { JwtModule } from '@auth0/angular-jwt';
export function tokenGetter() {
return localStorage.getItem('token');
}
@NgModule({
imports: [
// 配置JWT模块
JwtModule.forRoot({
config: {
tokenGetter: tokenGetter,
whitelistedDomains: ['your_domain'],
blacklistedRoutes: ['your_api_endpoint']
}
}),
// 其他模块...
],
// 其他配置...
})
export class AppModule { }
// auth.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { JwtHelperService } from '@auth0/angular-jwt';
@Injectable()
export class AuthService {
constructor(private http: HttpClient, private jwtHelper: JwtHelperService) { }
login(credentials) {
return this.http.post('/api/login', credentials);
}
isLoggedIn() {
const token = localStorage.getItem('token');
return !this.jwtHelper.isTokenExpired(token);
}
// 其他方法...
}
这是一个基本的解决方案,你可以根据自己的需求进行修改和扩展。希望对你有所帮助!