C# 为不同用户提供多个oauth令牌的Webapi

C# 为不同用户提供多个oauth令牌的Webapi,c#,authentication,asp.net-web-api,oauth-2.0,access-token,C#,Authentication,Asp.net Web Api,Oauth 2.0,Access Token,我正在asp.net中使用oauth作为授权提供程序创建自己的webapi。 api将基本上作为我所调用的不同模块的提供者。一个可以是图像库,另一个可以是具有不同类型用户的用户登录模块 我的oauth部分工作正常。Api用户可以通过使用登录凭据调用/Token端点来注册并请求令牌 但是,我现在想在api中创建另一个单独的用户模块,该模块只能由注册的api用户访问。我希望这个模块有另一个register和login函数,并有自己的登录端点(/UserModuleToken或类似的东西)。来自用户模

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

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

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

我的所有APIController都将具有api用户的[Authorize]属性,我希望使用[UserModuleAuthorize]属性修饰特定的APIController,例如用户模块中的某些函数

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

公共类ApiUserEntity:BaseEntity
{
公共字符串用户名{get;set;}
公共字符串密码{get;set;}
公共字符串电子邮件{get;set;}
公共字符串Salt{get;set;}
公共ApiUserLevel级别{get;set;}
}
可以验证api用户的userservice函数:

public用户登录结果登录用户(ApiUserEntityLoginForm用户表单)
{
//从数据库检索用户
var user=\u userRepository.GetUser(userForm.UserName);
if(user==null)
返回_modelStateWrapper.AddError(UserLoginResult.UserNotFound,“用户不存在”);
var passwordHash=passwordHash.HashPassword(user.Salt,userForm.Password);
//检查密码是否与数据库匹配。
if(passwordHash!=user.Password)
返回_modelStateWrapper.AddError(UserLoginResult.IncorrectPassword,“不正确的密码”);
返回UserLoginResult.Success;
}
在my webapi中调用/Token端点将调用令牌提供程序的以下函数:

public override异步任务GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext)
{
context.OwinContext.Response.Headers.Add(“访问控制允许来源”,新[]{“*”});
//创建userloginform对象:
var loginForm=new ApiUserEntityLoginForm{UserName=context.UserName,Password=context.Password};
//将其传递到userservice的登录验证函数:
var loginResult=\u userService.LoginUser(loginForm);
//如果登录结果不成功,则返回错误。
if(loginResult!=UserLoginResult.Success)
{
var jsonSerialiser=新的JavaScriptSerializer();
var json=jsonSerialiser.Serialize(_userService.Errors());
SetError(“无效的授权”,json);
返回;
}
//结果成功,授予令牌。
var identity=newclaimsidentity(context.Options.AuthenticationType);
identity.AddClaim(新声明(“sub”,context.UserName));
identity.AddClaim(新声明(“角色”、“用户”));
上下文验证(身份);
}
我配置oauth提供程序并使用以下函数定义/Token端点:

public static void ConfigureOAuth(IAppBuilder应用程序,IUnityContainer容器)
{
var simpleAuthorizationServerProvider=container.Resolve();
var OAuthServerOptions=新的OAuthAuthorizationServerOptions()
{
AllowInsecureHttp=true,
TokenEndpointPath=新路径字符串(“/token”),
AccessTokenExpireTimeSpan=TimeSpan.FromDays(1),
Provider=simpleAuthorizationServerProvider
};
//令牌生成
使用OAuthAuthorizationServer(OAuthServerOptions);
使用OAuthBeareAuthentication(新的OAuthBeareAuthenticationOptions());
}
现在我的问题是,是否有可能有多个令牌端点,这样我就可以为APIuser创建一个令牌,然后为使用自定义用户模块的用户创建另一个令牌,并基于这两个用户保护某些功能


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

我认为您需要根据角色配置用户授权,您试图做的只是使您的解决方案复杂化。 您可以执行以下操作:在方法
GrantResourceOwnerCredentials
中,您需要从DB存储中为经过身份验证的用户获取正确的角色,即“Admin”,然后将其添加为声明,类型为“role”,如下代码所示:

identity.AddClaim(new Claim(ClaimTypes.Role, "Admin"));
identity.AddClaim(new Claim(ClaimTypes.Role, "Supervisor"));
现在,在您的控制器上,您只想让角色为“Admin”的用户访问;您需要使用
[Authorize(Roles=“Admin”)]
或多个角色
[Authorize(Roles=“Admin,User”)]

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

顺便说一句,这个代码来自哪里?很高兴看到使用了我的代码示例:)
如果您需要进一步的澄清,请告诉我。

我相信您正在使事情复杂化,为什么不通过角色来管理它,您的API会检查角色?我的意思是,想要访问您的API的开发人员将拥有一个角色,您可以在您的authorizarion属性中检查该角色。阅读上的规范,它应该会澄清一些事情。感谢各位,事实上,角色对于我的目的来说是更好的。您的指南确实对我有很大的帮助!非常感谢!我理解你把事情弄得太复杂的意思。角色似乎是解决我的安全问题的完美解决方案:)我还真的想以某种方式区分在网站上注册的用户和开发人员