gpt4 book ai didi

asp.net-web-api - Asp.net 身份,生成 WebApi token OAuthGrantResourceOwnerCredentialsContext - 无法使用 Unity 访问 UserManager

转载 作者:行者123 更新时间:2023-12-01 15:01:29 25 4
gpt4 key购买 nike

我正在尝试设置项目结构,以便拥有 WebApi、WebUI 和域层。我已将所有 Asp.Net.Identity 对象移动到 Domain 层,并且还在此处设置了 ApplicationContext(继承自 IdentityContext)。

(我已经使用这个教程和包作为基础,非常好。http://tech.trailmax.info/2014/09/aspnet-identity-and-ioc-container-registration/)

在 WebAPI 层,我可以正确使用帐户 Controller 进行登录和注册。但是,我无法生成访问 token 。

OAuthGrantResourceOwnerCredentialsContext 方法内部使用

var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();

这工作正常,但没有给我与帐户 Controller 相同的上下文,因为我在其中使用 Unity 构造函数注入(inject)来使用域中的 ApplicationUserManager。

我已经尝试注入(inject) OAuth 类,但我似乎从未取回实例。

有什么建议吗?


编辑,这是我在默认 WebApi 项目的 Startup 类中的内容。

// Configure the application for OAuth based flow
PublicClientId = "self";
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = true
};

因此在获取访问 token 时似乎使用了 ApplicationOAuthProvider。

--更多信息。

UnityConfig.cs

container.RegisterType<ApplicationDbContext>(); //this is referencing my domain layer

启动.Auth.cs

app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<ApplicationUserManager>());

// Configure the application for OAuth based flow
PublicClientId = "self";
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = true
};

ApplicationOAuthProvider.cs

如下注入(inject)构造函数

public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
{
private readonly string _publicClientId;

private ApplicationUserManager userManager;

public ApplicationOAuthProvider(ApplicationUserManager userManager)
{
this.userManager = userManager;
}

public ApplicationOAuthProvider(string publicClientId)
{

//this.userManager = userManager;

if (publicClientId == null)
{
throw new ArgumentNullException("publicClientId");
}

_publicClientId = publicClientId;
}

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
//var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>(); //PROBLEM LINE!!!

ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);
}
}

问题行如上所示。请求 token 时会调用此方法,并且 userManager 始终为 null。


编辑以显示 UnityWebApiActivator.cs

public static class UnityWebApiActivator
{
/// <summary>Integrates Unity when the application starts.</summary>
public static void Start()
{
// Use UnityHierarchicalDependencyResolver if you want to use a new child container for each IHttpController resolution.
// var resolver = new UnityHierarchicalDependencyResolver(UnityConfig.GetConfiguredContainer());
var resolver = new UnityDependencyResolver(UnityConfig.GetConfiguredContainer());

GlobalConfiguration.Configuration.DependencyResolver = resolver;
}

/// <summary>Disposes the Unity container when the application is shut down.</summary>
public static void Shutdown()
{
var container = UnityConfig.GetConfiguredContainer();
container.Dispose();
}
}

最佳答案

我刚刚使用 Identity 创建了纯 WebApi 项目,检查了类,但不确定我是否正确理解了您的问题。

标准 VS2013 模板在 Startup.Auth.cs 中包含此内容:

public partial class Startup
{
public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }

public static string PublicClientId { get; private set; }

// For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
public void ConfigureAuth(IAppBuilder app)
{
// blah - other stuff

PublicClientId = "self";
OAuthOptions = new OAuthAuthorizationServerOptions
{
Provider = new ApplicationOAuthProvider(PublicClientId),
// another blah
};

app.UseOAuthBearerTokens(OAuthOptions);

//blah-blah-blah
}
}

我已经检查过 ApplicationOAuthProvider没有在其他任何地方使用。所以没必要注入(inject)。

在这个类中,正如你所说,它需要 context.OwinContext.GetUserManager<ApplicationUserManager>()获取用户管理器。如果您得到一个不正确的 ApplicationDbContext 实例在那里,然后你注入(inject)了不正确的 ApplicationUserManager 实例进入欧文上下文。你还有这样的台词吗:

app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

用这个替换它:

app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<ApplicationUserManager>());

这应该可以完成工作 - 将是最好的解决方案。

或者在 ApplicationOAuthProvider 中替换您获得 ApplicationUserManager 的行来自 OWIN 上下文:

var userManager = DependencyResolver.Current.GetService<ApplicationUserManager>()

这应该从 Unity 解析你的用户管理器,给你正确的 DbContext .

关于asp.net-web-api - Asp.net 身份,生成 WebApi token OAuthGrantResourceOwnerCredentialsContext - 无法使用 Unity 访问 UserManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27041112/

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