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

时间:2014-10-25 14:21:38

标签: c# authentication asp.net-web-api oauth-2.0 access-token

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

我的oauth部分工作正常。 Api用户可以通过使用登录凭据调用/ Token端点来注册然后请求令牌。

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

我所有的apicontrollers都有api用户的[Authorize]属性,我希望用[UserModuleAuthorize]属性修饰特定的属性,例如用户模块中的某些功能。

下面你可以看到我的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的令牌,然后是另一个用于使用自定义用户模块并基于这2个用户保护某些功能的用户。 / p>

经过大量的互联网搜索后,我找不到任何相关信息。所以我开始相信这不是好的做法或不可能。如果有人能指出我正确的方向,那就太好了!

1 个答案:

答案 0 :(得分:10)

我相信您需要根据角色配置用户授权,您要做的只是使您的解决方案复杂化。 你可以做的是:内部方法GrantResourceOwnerCredentials你需要从DB商店获得认证用户的正确角色,即管理员#34;然后将它们添加为类型为&#34; Role&#34;如下面的代码:

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

现在,在您的控制器上,您只需要具有角色的用户&#34;管理员&#34;访问;您需要使用[Authorize(Roles="Admin")]或多个角色[Authorize(Roles="Admin,User")]

进行归因

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

http://bitoftech.net获取此代码,对吗?很高兴看到我的代码示例使用:) 如果您需要进一步澄清,请告诉我。