gpt4 book ai didi

asp.net - 如何在 Web API 的服务上下文中访问用户?

转载 作者:行者123 更新时间:2023-12-04 00:59:46 25 4
gpt4 key购买 nike

如果您在 Controller 上下文中,则可以访问当前经过身份验证的用户。拿一篇文章如Get the current user, within an ApiController action, without passing the userID as a parameter .

但是,如果我的 Controller 调用服务(相同的程序集),但这里我没有 Controller 上下文。

实际获得经过身份验证的用户的最佳方法是什么?

最佳答案

您可以创建一个中间服务来提供该功能

public interface IPrincipalProvider {
IPrincipal User { get; }
}

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

并将其注入(inject)依赖的服务上下文
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 容器,以便当服务注入(inject) Controller 时,它也能够访问当前请求的用户。
[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 .

如果自托管还有其他方法可以访问它。

事实是,一旦通过身份验证,用户就可用。将它封装在抽象之后,您可以在 Controller 之外的任何需要的地方注入(inject)它。

Asp.net Core 引入了类似的东西 IHttpContextAccessor允许服务类访问当前的 HttpContext Controller 外
public interface IHttpContextAccessor {
HttpContext HttpContext { get; }
}

关于asp.net - 如何在 Web API 的服务上下文中访问用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45886836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com