사용자에게 리소스를 볼 수있는 권한을 부여하기 전에 비즈니스 계층 서비스 중 하나를 사용하여 데이터베이스의 일부 데이터를 확인해야하는 사용자 지정 AuthorizeAttribute
이 있습니다. 내 응용 프로그램에서이 같은 다른 속성의 몇 가지있다Asp Net Web Api에서 서비스 위치가있는 AuthorizeAttribute 대신 IAuthorizationFilter를 종속성 주입과 함께 사용하도록 코드를 다시 작성하는 방법?
internal class AuthorizeGetGroupByIdAttribute : AuthorizeAttribute
{
private readonly IUserGroupService _userGroupService;
public AuthorizeGetGroupByIdAttribute()
{
_userGroupService = ServiceLocator.Instance.Resolve<IUserGroupService>();
}
//In this method I'm validating whether the user is a member of a group.
//If they are not they won't get a permission to view the resource, which is decorated with this attribute.
protected override bool IsAuthorized(HttpActionContext actionContext)
{
Dictionary<string, string> parameters = actionContext.Request.GetQueryNameValuePairs().ToDictionary(x => x.Key, x => x.Value);
int groupId = int.Parse(parameters["groupId"]);
int currentUserId = HttpContext.Current.User.Identity.GetUserId();
return _userGroupService.IsUserInGroup(currentUserId, groupId);
}
protected override void HandleUnauthorizedRequest(HttpActionContext actionContex)
{
if (!HttpContext.Current.User.Identity.IsAuthenticated)
{
base.HandleUnauthorizedRequest(actionContex);
}
else
{
actionContex.Response = new HttpResponseMessage(HttpStatusCode.Forbidden);
}
}
}
: 위해 내가 서비스 위치 "안티 패턴"을 사용하기로 결정 내 AuthorizeAttribute
내에서이 서비스를 할당 할 수 있도록,이 코드입니다. 서비스 위치 지정자를 사용하는 것은 좋은 방법이 아닙니다. 웹을 조금 검색 한 후에 어떤 사람들은 의존성 삽입으로 IAuthorizationFilter
을 사용하도록 제안하는 것을 발견했습니다. 그러나 이런 종류의 글을 쓰는 방법을 모르겠습니다. IAuthorizationFilter
. 위의 AuthorizeAttribute
과 똑같은 일을 할 IAuthorizationFilter
을 작성할 수 있습니까?
필터에서 GetGroupByIdAttribute 대신 AddUserToGroupAttribute를 사용하셨습니까? 또한 이것이 DB에 도달하면 컨텍스트를 처리하는 코드는 어떻게됩니까? – DDiVita
@DDiVita, 수동 속성'GetGroupByIdAttribute'의 이름을 지정하기 위해 이미 답변을 업데이트했습니다. 이 예제에서'_userGroupService'는 비즈니스 레이어의 클래스로 데이터 액세스 레이어를 호출하므로'GetGroupByIdAuthorizationFilter'에 컨텍스트를 처리 할 필요가 없습니다. –