首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Active Directory的基于策略的具有角和ASP.NET核的授权

使用Active Directory的基于策略的具有角和ASP.NET核的授权
EN

Stack Overflow用户
提问于 2020-03-18 08:11:29
回答 1查看 266关注 0票数 0

我正在开发一个intranet应用程序。

后端:.NET核心网络API-2 前端:角4+

对于后端,我使用了基于Windows策略的授权,并且从Active Directory获取所有用于授权的信息。见下文代码:

我的授权处理程序

代码语言:javascript
复制
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;
        }
    }

启动

代码语言:javascript
复制
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和客户端,我有两个单独的项目。

我环顾四周,却没有发现任何有用的东西。有人能指点我吗?

提前感谢

EN

回答 1

Stack Overflow用户

发布于 2020-03-18 09:19:17

我的一个项目也有同样的问题。

我给出的解决这个问题的方法是使用cookie和BehaviourSubject。

当用户登录时,我们将响应数据(用户名、用户数据、令牌)保存到cookie中。

当角应用程序在关闭后加载时,

我们检查是否有数据存储在cookie中,

如果是真的,我们会检查cookie是否有效,

如果再次为真,我们允许用户与应用程序交互。

如果没有cookie或cookie是无效的,我们将他重定向到登录页面。

在登录时,我们清除cookie并将用户主题设置为null

示例代码

代码语言:javascript
复制
  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);
        }
      }));
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60735633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档