1

Я внедрил custom OAuthAuthorizationServerProvider, чтобы добавить ограничение домена для входа в учетную запись. Все было хорошо. Однако я столкнулся с проблемой, что, как только пользователь получит токен, они могут использовать его для любой системы, которую они хотят. Например:Как повторно проверить токен для многопользовательской идентификации ASP.NET?

Они запрашивают TokenEndpointPath с правильным именем пользователя и паролем (предположим, что это учетная запись администратора Арендатора 1): http://localhost:40721/api/v1/account/auth и получить токен-носитель.

Теперь они используют его для доступа: http://localhost:40720/api/v1/info/admin, который принадлежит арендатору 0. Запрос считается авторизованным.

Я попытался изменить метод CreateProperties, но это не помогло:

public static AuthenticationProperties CreateProperties(string userName) 
    { 
     var tenant = DependencyUtils.Resolve<IdentityTenant>(); 
     IDictionary<string, string> data = new Dictionary<string, string> 
     { 
      { "userName", userName }, 
      { "tenantId", tenant.Tenant.Id.ToString() }, 
     }; 
     return new AuthenticationProperties(data); 
    } 

Я также попытался перекрывая ValidateAuthorizeRequest, но он никогда не вызывается в моей отладки.

Нужно ли мне выполнять проверку в другом месте, поэтому токен действителен только для домена/правильного арендатора?

(ПРИМЕЧАНИЕ. У арендатора может быть несколько доменов, поэтому отлично, если я могу вручную выполнить проверку учетной записи против правильного арендатора, а не придерживаться домена. Однако это плюс, если я могу это сделать, или просто просто ограничить токен доменом нормально)

ответ

0

Не прямой ответ на мой вопрос (поскольку он не находится в рабочем процессе ASP.NET Identity), но самым простым исправлением, которое я применил, было вместо этого использовать ActionFilterAttribute.

public class DomainValidationFilter : ActionFilterAttribute 
{ 

    public override Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken) 
    { 
     // Other Code... 

     // Validate if the logged in user is from correct tenant 
     var principal = actionContext.ControllerContext.RequestContext.Principal; 
     if (principal != null && principal.Identity != null && principal.Identity.IsAuthenticated) 
     { 
      var userId = int.Parse(principal.Identity.GetUserId()); 
      // Validate against the tenant Id of your own storage, and use this code to invalidate the request if it is trying to exploit: 
      actionContext.Response = actionContext.Request.CreateResponse(System.Net.HttpStatusCode.Unauthorized, "Invalid Token"); 

     } 

     return base.OnActionExecutingAsync(actionContext, cancellationToken); 
    } 

} 

Затем применяет фильтр ко всем действиям, зарегистрировав его в любом FilterConfig или WebApiConfig:

config.Filters.Add(new DomainValidationFilter());