gpt4 book ai didi

c# - 注入(inject)的 IPrincipal 是匿名的,但 Web API Controller 用户对象已通过身份验证

转载 作者:行者123 更新时间:2023-11-30 17:48:22 25 4
gpt4 key购买 nike

我正在编写一个 Web API 2/MVC5 项目,我想对一些必须使用 ASP.Net Identity 的 IPrincipal 的代码进行单元测试。我不想依赖 IPrincipal,而是想将其抽象为我自己的 IUserService。当我查看我注入(inject)的 IUserService UserIdUserName为空。

public interface IUserService
{
string UserId { get; }
string UserName { get; }
}

正在使用的具体实现是:

public class UserService : IUserService
{
private IPrincipal _principal;

public UserService(IPrincipal principal)
{
_principal = principal;
}

public string UserName
{
get { return _principal.Identity.GetUserName(); }

}

public string UserId
{
get { return _principal.Identity.GetUserId(); }

}
}

这是使用 Ninject 进行依赖注入(inject)。在 NinjectWebCommon.cs 中我有:

private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IBooksService>().To<BooksService>().InRequestScope();
kernel.Bind<DbContext>().To<ApplicationDbContext>().InRequestScope();
kernel.Bind<ApplicationDbContext>().To<ApplicationDbContext>().InRequestScope();
kernel.Bind<IUserStore<ApplicationUser>>().To<UserStore<ApplicationUser>>().InRequestScope();
kernel.Bind<UserManager<ApplicationUser>>().To<UserManager<ApplicationUser>>().InRequestScope();
kernel.Bind<IBookRepository>().To<BookRepository>().InRequestScope();
kernel.Bind<IUserService>().To<UserService>().InRequestScope();
kernel.Bind<IPrincipal>().ToMethod(ctx => HttpContext.Current.User);
}

如果我创建一个 Func<IPrincipal>并通过 ()=>HttpContext.Current.User一切正常。但是,我看不到任何人需要这样做,并且所有示例都建议采用这种实现方式。

最佳答案

您是否对用户进行身份验证?用户通过身份验证后,您需要注意创建 IIdentityIPrincipal。然后,你需要用IPrincipal设置Thread.CurrentPrincipal,你还需要把IPrincipal放在当前的HttpContext.

为了不将 GenericIdentity 视为匿名,Name 属性必须是非空字符串。为了不将 ClaimsIdentity 视为匿名,AuthenticationType 属性必须是非空字符串。

因此,一般来说,您将执行以下操作:

// Perform authentication, usually using some kind of AuthenticationFilter or
// AuthorizationFilter.
// After authenticating, and still within the Auth*Filter,

// I'm going to use a GenericIdentity, but this can be converted to a
// ClaimsIdentity if you're using the default Name claim.
IIdentity identity = new GenericIdentity("myUserName", "myAuthenticationType");

// Again, you could use a ClaimsPrincipal, the concept, however, is the same.
IPrincipal principal = new GenericPrincipal(identity, null /* no roles */);
HttpContext.Current.User = principal;
Thread.CurrentPrincipal = principal;

我确实看到您提到正在使用新的 ASP.Net Identity 模型。因此,您肯定会在代码中使用 ClaimsIdentityClaimsPrincipal

关于c# - 注入(inject)的 IPrincipal 是匿名的,但 Web API Controller 用户对象已通过身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23178687/

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