>source

/ Pages의 특정 폴더에 각각 포함 된 여러 응용 프로그램이있는 프로젝트가 있습니다./Pages/PTW,/Page/JM 등. 이미 각 페이지에 대해 사용자 인증 및 역할 관리를 구현했습니다. 특정 회사 사용자가 특정 폴더의 페이지에 액세스 할 수 있도록 회사에 대한 정책 인증을 구현하고 싶습니다.

using System;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using RoSafety.Models;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using RoSafety.Data;
public class AccessCodeRequirement : IAuthorizationRequirement
{
    public string AccessCode { get; set; }
    public AccessCodeRequirement(string accessCode)
    {
        AccessCode = accessCode;
    }
}
public class AccessCodeHandler : AuthorizationHandler<AccessCodeRequirement>
{
    private readonly ApplicationDbContext _context;
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                   AccessCodeRequirement requirement)
    {
        var userId = context.User.FindFirstValue(ClaimTypes.NameIdentifier);
        var orgID = _context.UsersData.Where(x => x.Id == userId).Select(x => x.OrgID).FirstOrDefault();
        var orgAccess = _context.CompanyAccesses.Select(x => x.AccessCode).ToList();
        foreach(var a in orgAccess)
        {
            var access = a;
            if(access == requirement.AccessCode)
            {
                context.Succeed(requirement);
            }
        }
        return Task.CompletedTask;
    }
}

내가 추가 한 스타트 업에서

options.AddPolicy("PTW", policy =>
                policy.Requirements.Add(new AccessCodeRequirement("RO-01")));

그리고 내가 가지고있는 페이지에서

[Authorize(Policy = "PTW")]

CompanyAccesses 테이블의 OrgID에 대한 AccessCode는 "RO-01"이지만 여전히 액세스가 거부되었습니다. 내가 뭘 잘못 했어?

  • 답변 # 1

    먼저 _context 당신의 AccessCodeHandler 주사에 실패했습니다. AccessCodeHandler 다음과 같이.

    public class AccessCodeHandler : AuthorizationHandler<AccessCodeRequirement>
    {
        private readonly ApplicationDbContext _context;
        //add following code
        public AccessCodeHandler(ApplicationDbContext context)
        {
            _context = context;
        }
        //.....
    }
    
    

    그런 다음 startup , 서비스를 추가해야합니다.

    services.AddAuthorization(options =>
            {
                options.AddPolicy("PTW", policy =>
                    policy.Requirements.Add(new AccessCodeRequirement("RO-01")));
            });
     //add this code.
     services.AddTransient<IAuthorizationHandler, AccessCodeHandler>();
    
    

관련 자료

  • 이전 javascript - 해결 된 약속 값을 볼 수 없습니다
  • 다음 manifest.json - reactjs 매니페스트 설정을 특정 URL로