asp.net 如何在.net WebApi2应用程序中使用OAuth2令牌请求中的额外参数

2uluyalo  于 2022-12-24  发布在  .NET
关注(0)|答案(1)|浏览(108)

我在一个大型的. net MVC 5 web解决方案中有一个特定于api的项目。我正在使用WebApi2模板通过api验证用户。使用单独的帐户进行验证,获得访问令牌所需的请求主体是:

grant_type=password&username={someuser}&password={somepassword}

这按预期工作。
但是,我需要向搭建的方法"GrantResourceOwnerCredentials"添加第3个维度。除了检查用户名/密码之外,我还需要添加设备ID,这意味着限制用户帐户对特定设备的访问。不清楚的是如何将这些额外的请求参数添加到已经定义的"OAuthGrantResourceOwnerCredentialsContext"中。此上下文当前为用户名和密码腾出了空间。但显然我需要更多的证据。
我的问题很简单,是否有一种标准的方法来扩展OWIN OAuth2令牌请求的登录要求以包含更多数据?在. NET WebApi2环境中如何可靠地做到这一点?

8yparm6h

8yparm6h1#

就像往常一样,我在提交问题后立即找到了答案...
ApplicationOAuthProvider.cs包含以下现成的代码

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
    using (UserManager<IdentityUser> userManager = _userManagerFactory())
    {
        IdentityUser user = await userManager.FindAsync(context.UserName, context.Password);

        if (user == null)
        {
            context.SetError("invalid_grant", "The user name or password is incorrect.");
            return;
        }

        ClaimsIdentity oAuthIdentity = await userManager.CreateIdentityAsync(user,
            context.Options.AuthenticationType);
        ClaimsIdentity cookiesIdentity = await userManager.CreateIdentityAsync(user,
            CookieAuthenticationDefaults.AuthenticationType);
        AuthenticationProperties properties = CreateProperties(context.UserName, data["udid"]);
        AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
        context.Validated(ticket);
        context.Request.Context.Authentication.SignIn(cookiesIdentity);
    }
}

通过简单地添加

var data = await context.Request.ReadFormAsync();

在这个方法中,你可以访问请求体中的所有变量,并随意使用它们,在我的例子中,我把它放在用户的空值检查之后,以执行更严格的安全检查。

相关问题