具有针对不同用户的多个oauth令牌的Webapi

本文关键字:令牌 Webapi oauth 用户 | 更新日期: 2023-09-27 18:27:45

我正在使用oauth作为授权提供程序在asp.net中创建自己的webapi。api将基本上充当我所称的不同模块的提供者。一个可以是图像库,另一个可以只是具有不同类型用户的用户登录模块。

我有一个愚蠢的部分工作得很好。Api用户可以注册,然后通过使用登录凭据调用/Token端点来请求令牌。

然而,我现在想在api中创建另一个单独的用户模块,该模块只能由注册的apiusers访问。我希望这个模块有另一个注册和登录功能,并有自己的登录端点(/UserModuleToken或类似的东西)。来自用户模块的用户与Api用户不同。因此,apiusers是希望调用我的api中特定模块的实际开发人员,而用户模块中的用户是在实现该模块的网站上注册的用户。

我的所有apicontroller都有api用户的[Authorize]属性,我希望特定的控制器,例如用户模块中的某个函数,用[UserModuleAuthorize]attribute来修饰。

下面你可以看到我的api用户实体模型:

public class ApiUserEntity : BaseEntity
{
    public string Username { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }
    public string Salt { get; set; }
    public ApiUserLevel Level { get; set; }
}

可以验证api用户的userservice函数:

public UserLoginResult LoginUser(ApiUserEntityLoginForm userForm)
{
    // retrieve user from database
    var user = _userRepository.GetUser(userForm.UserName);
    if(user == null)
        return _modelStateWrapper.AddError(UserLoginResult.UserNotFound, "User does not exist");
    var passwordHash = PasswordHash.HashPassword(user.Salt, userForm.Password);
    // check if password matches with database.
    if (passwordHash != user.Password)
        return _modelStateWrapper.AddError(UserLoginResult.IncorrectPassword, "Incorrect password");
    return UserLoginResult.Success;
}

在我的webapi中调用/Token端点将调用令牌提供者的以下函数:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
    context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
    // create a userloginform object : 
    var loginForm = new ApiUserEntityLoginForm {UserName = context.UserName, Password = context.Password};
    // pass it into the login validation function of the userservice:
    var loginResult = _userService.LoginUser(loginForm);
    // if login result was not sucesful, return an error.
    if (loginResult != UserLoginResult.Success)
    {
        var jsonSerialiser = new JavaScriptSerializer();
        var json = jsonSerialiser.Serialize(_userService.Errors());
        context.SetError("invalid_grant", json);
        return;
    }
    // result was succesful, grant the token.
    var identity = new ClaimsIdentity(context.Options.AuthenticationType);
    identity.AddClaim(new Claim("sub", context.UserName));
    identity.AddClaim(new Claim("role", "user"));
    context.Validated(identity);
}

我配置我的oauth提供程序,并使用以下函数定义/Token端点:

public static void ConfigureOAuth(IAppBuilder app, IUnityContainer container)
{
    var simpleAuthorizationServerProvider = container.Resolve<SimpleAuthorizationServerProvider>();
    var OAuthServerOptions = new OAuthAuthorizationServerOptions()
    {
        AllowInsecureHttp = true,
        TokenEndpointPath = new PathString("/token"),
        AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
        Provider = simpleAuthorizationServerProvider
    };
    // Token Generation
    app.UseOAuthAuthorizationServer(OAuthServerOptions);
    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}

现在我的问题是,是否有可能拥有多个令牌端点,这样我就可以为apiusers拥有一个令牌,然后为使用自定义用户模块的用户拥有另一个令牌并保护基于这两个用户的某些功能。

我在互联网上搜索了很多,却找不到这方面的任何信息。所以我开始相信这不是一个好的做法或不可能。如果有人能为我指明正确的方向,那就太好了!

具有针对不同用户的多个oauth令牌的Webapi

我认为您需要基于角色来配置用户授权,您所要做的只是使您的解决方案复杂化。您可以做以下操作:在方法GrantResourceOwnerCredentials中,您需要从数据库存储中获得经过身份验证的用户的正确角色,即"管理员",然后将其添加为声明,并键入"角色"作为以下代码:

identity.AddClaim(new Claim(ClaimTypes.Role, "Admin"));
identity.AddClaim(new Claim(ClaimTypes.Role, "Supervisor"));

现在在您的控制器上,您只想让角色为"管理员"的用户访问;您需要具有[Authorize(Roles="Admin")]属性,或者可能具有多个角色[Authorize(Roles="Admin,User")]

这是实现目标的最直接的方法。

Btw此代码来自http://bitoftech.net正确的很高兴看到我的代码示例被使用:)如果你需要进一步澄清,请告诉我。