gpt4 book ai didi

c# - 具有针对不同用户的多个 oauth token 的 Webapi

转载 作者:太空狗 更新时间:2023-10-30 00:14:29 27 4
gpt4 key购买 nike

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

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

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

我所有的 apicontroller 都会有 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 端点将调用 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());

}

现在我的问题是,是否有可能以某种方式拥有多个 token 端点,这样我就可以为 apiusers 提供一个 token ,然后为使用自定义用户模块的用户提供另一个 token ,并根据这两个用户保护某些功能。

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

最佳答案

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

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

现在在您的 Controller 上,您希望只有具有“Admin”角色的用户才能访问;您需要使用 [Authorize(Roles="Admin")] 或多个角色 [Authorize(Roles="Admin,User")]

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

顺便说一句,这段代码来自 http://bitoftech.net , 正确的?很高兴看到我的代码示例被使用 :)如果您需要进一步说明,请告诉我。

关于c# - 具有针对不同用户的多个 oauth token 的 Webapi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26563416/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com