c# – Webapi为不同的用户提供多个oauth令牌
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – Webapi为不同的用户提供多个oauth令牌,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3991字,纯文字阅读大概需要6分钟。
内容图文
我正在使用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个用户保护某些功能.
经过大量的互联网搜索,我找不到任何相关信息.所以我开始相信这不是好的做法或不可能.如果有人能够指出我正确的方向,这将是伟大的!
解决方法:
我相信您需要根据角色配置用户授权,您尝试做的只是使您的解决方案复杂化.
您可以执行以下操作:内部方法GrantResourceOwnerCredentials您需要从DB存储中获取经过身份验证的用户的正确角色,即“Admin”,然后将其添加为类型为“Role”的声明,如下所示:
identity.AddClaim(new Claim(ClaimTypes.Role, "Admin"));
identity.AddClaim(new Claim(ClaimTypes.Role, "Supervisor"));
现在在您的控制器上,您只需要具有角色“Admin”的用户访问;您需要使用[授权(角色=“管理员”)]或多个角色[授权(角色=“管理员,用户”)]进行归因
这是实现目标的最直接方式.
从http://bitoftech.net开始这个代码吧?很高兴看到我的代码示例使用:)
如果您需要进一步澄清,请与我们联系.
内容总结
以上是互联网集市为您收集整理的c# – Webapi为不同的用户提供多个oauth令牌全部内容,希望文章能够帮你解决c# – Webapi为不同的用户提供多个oauth令牌所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。