Asp.net
如何在 Web API 的服務上下文中訪問使用者?
如果您在控制器上下文中,則可以訪問目前經過身份驗證的使用者。在 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.User和ApiController.User.如果自託管還有其他方法可以訪問它。
事實是,一旦通過身份驗證,使用者就可用。將其封裝在抽象之後,您可以在控制器之外的任何需要的地方注入它。
Asp.net Core 引入了類似的東西
IHttpContextAccessor,它允許服務類訪問HttpContext控制器的目前輸出端public interface IHttpContextAccessor { HttpContext HttpContext { get; } }