我正在开发一个intranet应用程序。
后端:.NET核心网络API-2 前端:角4+
对于后端,我使用了基于Windows策略的授权,并且从Active Directory获取所有用于授权的信息。见下文代码:
我的授权处理程序
public class BranchUserHandler : AuthorizationHandler<BranchUserRequirement>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, BranchUserRequirement requirement)
{
string userCPNumber = context.User.Identity.Name;
using (var ctx = new PrincipalContext(ContextType.Domain, "CAPITECBANK"))
{
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, userCPNumber);
if (user == null)
{
return Task.CompletedTask;
}
else
{
string userCompany = user.GetCompany();
if (requirement.Company == userCompany)
{
string userDepartment = user.GetDepartment();
if (requirement.Department == user.GetDepartment())
{
string userDescription = user.GetDescription();
if (requirement.Description == userDescription)
{
string userTitle = user.GetTitle();
if (requirement.Title.Contains(userTitle))
{
context.Succeed(requirement);
}
}
}
}
}
}
return Task.CompletedTask;
}
}启动
public void ConfigureServices(IServiceCollection services)
{
services.ConfigureRepositoryContext(Configuration);
services.configureRepositoryWrapper();
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder.WithOrigins("http://localhost:62000")
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});
services.ConfigureSwagger();
services.AddAutoMapper(typeof(Startup));
services.Configure<IISOptions>(options =>
{
options.AutomaticAuthentication = true;
});
services.AddAuthorization(options =>
{
options.AddPolicy("WorksInBranch", policy => policy.Requirements.Add(new BranchUserRequirement("Information Technology",
"Systems Development - Revenue & Products", "SYSTEM DEVELOPMENT",
new List<string>{"Regional Manager", "Branch Manager", "Assistant Branch Manager",
"ATM Assistant", "Service Consultant", "Sales Consultant", "Junior Support Analyst: Card Processing Channels"})));
});
services.AddSingleton<IAuthorizationHandler, BranchUserHandler>();
services.AddAuthentication(IISDefaults.AuthenticationScheme);
services.AddMvc()
.AddJsonOptions(
options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
);
//services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}因此,在角度前端,我希望用户在当前登录到他们的windows机器时自动获得授权,也就是说,如果用户登录到他们的windows机器上,就不能提示用户输入凭据。
请注意,对于Web和客户端,我有两个单独的项目。
我环顾四周,却没有发现任何有用的东西。有人能指点我吗?
提前感谢
发布于 2020-03-18 09:19:17
我的一个项目也有同样的问题。
我给出的解决这个问题的方法是使用cookie和BehaviourSubject。
当用户登录时,我们将响应数据(用户名、用户数据、令牌)保存到cookie中。
当角应用程序在关闭后加载时,
我们检查是否有数据存储在cookie中,
如果是真的,我们会检查cookie是否有效,
如果再次为真,我们允许用户与应用程序交互。
如果没有cookie或cookie是无效的,我们将他重定向到登录页面。
在登录时,我们清除cookie并将用户主题设置为null
示例代码
private user: BehaviorSubject<User> = new BehaviorSubject<User>(this.userCookies());
public user$: Observable<User> = this.user.asObservable();
userCookies(): User | null {
const local = this.cookieService.get('userData');
if (local) {
return JSON.parse(local);
}
return null;
}
setUserCookie(user: User) {
this.cookieService.set('userData', JSON.stringify(user));
}
login(payload) {
return this.loginRequest(loginData).pipe(
// login successful if there's a token in the response
tap(data => {
if (data && data.token) {
this.setUserCookie(data);
this.user.next(data);
this.router.navigate([ '/' ]);
} else if (data.error) {
this.user.next(null);
}
}));
}https://stackoverflow.com/questions/60735633
复制相似问题