Asp.net

如何在 Web API 的服務上下文中訪問使用者?

  • August 28, 2017

如果您在控制器上下文中,則可以訪問目前經過身份驗證的使用者。在 ApiController 操作中獲取諸如獲取目前使用者之類的文章,而不將 userID 作為參數傳遞

但是,如果我的控制器呼叫服務(相同的程序集),但這裡我沒有控制器上下文。

實際獲得經過身份驗證的使用者的最佳方法是什麼?

您可以創建一個中間服務來提供該功能

public interface IPrincipalProvider {
   IPrincipal User { get; }
}

public class WebApiPrincipalProvider : IPrincipalProvider {
   public IPrincipal User { 
       get {
           return HttpContext.Current != null
               ? HttpContext.Current.User 
               : null;
       }
   }
}

並將其註入依賴的服務上下文

public class MyService : IService {
   private readonly IPrincipalProvider provider;

   public MyService(IPrincipalProvider provider) {
       this.provider = provider;
   }

   public MyModel MyServiceMethod() {
       var currentUser = provider.User;
       var name = currentUser.Identity.Name;

       //...use user....

       return model;
   }
}

最後確保抽象和實現在主應用程序的組合根中註冊到 DI 容器,以便當服務注入控制器時,它也能夠訪問目前請求的使用者。

[Authorize]
public class MyController : ApiController {
   public readonly IService service;

   public MyController (IService service) {
       this.service = service;
   }

   [HttpGet]
   public IHttpActionResult MyGetActiom() {
       var model = service.MyServiceMethod();
       return Ok(model);
   }
}

當身份框架對使用者進行身份驗證時,然後為目前上下文設置使用者主體。

如果託管在 IIS 中,您可以HttpContext像前面提供的範例一樣訪問使用者。MVC 和 Web API 基本上做一些類似於填充Controller.UserApiController.User.

如果自託管還有其他方法可以訪問它。

事實是,一旦通過身份驗證,使用者就可用。將其封裝在抽象之後,您可以在控制器之外的任何需要的地方注入它。

Asp.net Core 引入了類似的東西IHttpContextAccessor,它允許服務類訪問HttpContext控制器的目前輸出端

public interface IHttpContextAccessor {
   HttpContext HttpContext { get; }
}

引用自:https://stackoverflow.com/questions/45886836