gpt4 book ai didi

asp.net-identity - 自定义 UserManager 在 OAuthAuthorizationServerProvider 中不可用

转载 作者:行者123 更新时间:2023-12-02 04:52:06 32 4
gpt4 key购买 nike

我正在 WebApi 系统中实现 ASP.Net Identity 2。要管理新帐户的电子邮件确认,我必须创建一个自定义 ApplicationUserManager 并注册它,以便为每个请求创建它:

public class IdentityConfig{
public static void Initialize(IAppBuilder app)
{
[snip]
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
}

它在 ApiController 中正常工作,如下所示:

public class AccountController : ApiController
{
public ApplicationUserManager UserManager
{
get
{
return HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
}

我面临的问题是,在我尝试在 OAuth token 创建方法中访问它之前,没有调用 ApplicationUserManager.Create 方法:

public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
var mgr = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();

在上面的代码中,mgr 为 null,因为 GetUserManager 检索到 null

token 创建方法是否在管道中处于较早位置,以至于尚未调用 CreatePerOwinContext 方法?如果是这样,缓存 ApplicationUserManager 以便可以在 GrantResourceOwnerCredentials 内部使用的最佳方法是什么?

最佳答案

这个很棘手。事实证明,启动代码必须按照一定的顺序完成。

这段代码可以工作。

public class IdentityConfig{
public static void Initialize(IAppBuilder app)
{
// correct... first create DB context, then user manager, then register OAuth Provider
app.CreatePerOwinContext(AuthContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);

OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = new SimpleAuthorizationServerProvider()
};
app.UseOAuthAuthorizationServer(OAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
}

如果您更改在应用程序中注册代码的顺序,可能会产生意想不到的后果。此代码导致 ApplicationUserManager 在 token 生成方法 GrantResourceOwnerCredentials 中为 null

// wrong... these two lines must be after the ApplicationUserManager.Create line
app.UseOAuthAuthorizationServer(OAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

[snip]

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

当我这样做时,还有另一件事可能会绊倒别人。这些行导致 AuthContext 在 token 生成方法 GrantResourceOwnerCredentials 内为 null

// wrong... The AuthContext must be instantiated before the ApplicationUserManager
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext(AuthContext.Create);

[snip]

app.UseOAuthAuthorizationServer(OAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

关于asp.net-identity - 自定义 UserManager 在 OAuthAuthorizationServerProvider 中不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27731893/

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