gpt4 book ai didi

c# - 向 Bearer 授权添加额外的逻辑

转载 作者:可可西里 更新时间:2023-11-01 02:58:54 25 4
gpt4 key购买 nike

我正在尝试实现 OWIN 不记名 token 授权,并基于 this article .但是,我不知道如何实现不记名 token 中的一条额外信息。

在我的应用程序中,我需要从不记名 token 用户信息(比如用户 ID)中推断出来。这很重要,因为我不希望授权用户能够充当另一个用户。这可行吗?这甚至是正确的方法吗?如果 userid 是一个 guid,那么这就很简单了。在这种情况下它是一个整数。授权用户可能仅通过猜测/暴力来冒充另一个人,这是 Not Acceptable 。

查看这段代码:

public void ConfigureOAuth(IAppBuilder app)
{
OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = new SimpleAuthorizationServerProvider()
};

// Token Generation
app.UseOAuthAuthorizationServer(OAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}

public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
context.Validated();
}

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

using (AuthRepository _repo = new AuthRepository())
{
IdentityUser user = await _repo.FindUser(context.UserName, context.Password);

if (user == null)
{
context.SetError("invalid_grant", "The user name or password is incorrect.");
return;
}
}

var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim("sub", context.UserName));
identity.AddClaim(new Claim("role", "user"));

context.Validated(identity);
}
}

我认为可以覆盖授权/身份验证以满足我的需要吗?

最佳答案

您的代码中似乎缺少某些内容。
您没有验证您的客户。

你应该实现 ValidateClientAuthentication并在那里检查您客户的凭据。

这是我的做法:

public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
string clientId = string.Empty;
string clientSecret = string.Empty;

if (!context.TryGetBasicCredentials(out clientId, out clientSecret))
{
context.SetError("invalid_client", "Client credentials could not be retrieved through the Authorization header.");
context.Rejected();
return;
}

ApplicationDatabaseContext dbContext = context.OwinContext.Get<ApplicationDatabaseContext>();
ApplicationUserManager userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();

if (dbContext == null)
{
context.SetError("server_error");
context.Rejected();
return;
}

try
{
AppClient client = await dbContext
.Clients
.FirstOrDefaultAsync(clientEntity => clientEntity.Id == clientId);

if (client != null && userManager.PasswordHasher.VerifyHashedPassword(client.ClientSecretHash, clientSecret) == PasswordVerificationResult.Success)
{
// Client has been verified.
context.OwinContext.Set<AppClient>("oauth:client", client);
context.Validated(clientId);
}
else
{
// Client could not be validated.
context.SetError("invalid_client", "Client credentials are invalid.");
context.Rejected();
}
}
catch (Exception ex)
{
string errorMessage = ex.Message;
context.SetError("server_error");
context.Rejected();
}
}

一篇好文章可以找到详细的here .
在此 blog 中可以找到更好的解释系列。

更新:

我做了一些挖掘和 webstuff是对的。

为了将 errorDescription 传递给客户端,我们需要在使用 SetError 设置错误之前 Rejected:

context.Rejected();
context.SetError("invalid_client", "The information provided are not valid !");
return;

或者我们可以扩展它,在描述中传递一个序列化的 json 对象:

context.Rejected();
context.SetError("invalid_client", Newtonsoft.Json.JsonConvert.SerializeObject(new { result = false, message = "The information provided are not valid !" }));
return;

enter image description here

使用 javascript/jQuery 客户端,我们可以反序列化文本响应并读取扩展消息:

$.ajax({
type: 'POST',
url: '<myAuthorizationServer>',
data: { username: 'John', password: 'Smith', grant_type: 'password' },
dataType: "json",
contentType: 'application/x-www-form-urlencoded; charset=utf-8',
xhrFields: {
withCredentials: true
},
headers: {
'Authorization': 'Basic ' + authorizationBasic
},
error: function (req, status, error) {
if (req.responseJSON && req.responseJSON.error_description)
{
var error = $.parseJSON(req.responseJSON.error_description);
alert(error.message);
}
}
});

关于c# - 向 Bearer 授权添加额外的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24340088/

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