owin oauth 发送附加参数
owin oauth send additional parameters
我确定这是可能的,但不确定如何实现。我有一个 OWIN OAUTH 实现,它当前接受用户的用户名和密码并根据数据库对它们进行身份验证。我想扩展它以传入智能卡 Uid 以支持使用智能卡进行单点登录。
我可以在 OWIN 登录中传递额外的参数吗?如果可以,如何传递?基本前提是用户可以使用 username/password 组合或智能卡 uid 登录(如果传递智能卡 uid 并且在数据库中找到,则应用程序将使用户登录)
我目前正在传递 username
、password
和 grant_type
,我想将 uid
添加到该列表并在我的 AuthorizationServiceProvider
.
我可以在 OAuthGrantResourceOwnerCredentialsContext
上看到 UserName
、Password
和 ClientId
,但我看不到任何其他可以支持我想要实现的目标的属性。
这是我目前在我的服务提供商中拥有的内容
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
var user = await this._userService.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(ClaimTypes.Sid, user.Id.ToString()));
identity.AddClaim(new Claim(ClaimTypes.Role, "user"));
identity.AddClaim(new Claim("sub", context.UserName));
var secretKeyBytes = Encoding.UTF8.GetBytes(user.PasswordHash);
var props =
new AuthenticationProperties(
new Dictionary<string, string>
{
{ "dm:appid", user.Id.ToString() },
{ "dm:apikey", Convert.ToBase64String(secretKeyBytes) }
});
var ticket = new AuthenticationTicket(identity, props);
context.Validated(ticket);
}
我也希望能够从上下文中获取 Uid,但无论如何都看不到实现这一点,非常感谢任何帮助。
如果您还没有实施,则必须实施 ValidateClientAuthentication
。
这是您验证客户端的地方。
在这种方法中,您将对您的客户端进行某种验证,并设置 objects/variable 可以在 GrantResourceOwnerCredentials
.
中读取
Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
收到一个 OAuthValidateClientAuthenticationContext
,其中包含您在 POST 发送到您的授权服务器时传递的附加字段。
在上图中,我在第 4 个位置添加了一个额外的参数 uid
。
在验证上下文之前:
context.Validated(clientId);
你可以设置你的variable/object:
string uid = context.Parameters.Where(f => f.Key == "uid").Select(f => f.Value).SingleOrDefault()[0];
context.OwinContext.Set<string>("SmartCard", uid);
现在,在您的 GrantResourceOwnerCredentials
中,您可以简单地读取值并使用它:
string uid = context.OwinContext.Get<string>("SmartCard");
如果您想了解更多信息,可以看看这个 github repository 我在其中传递了一个对象:
context.OwinContext.Set<ApplicationClient>("oauth:client", client);
如果您下载了整个解决方案,您可以使用 javascript/jquery 客户端对其进行测试。
更新:
您将在您的 http POST 请求中传递一个附加参数(即:uid):
原版 Js:
var request = new XMLHttpRequest();
request.open('POST', oAuth.AuthorizationServer, true);
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
request.setRequestHeader('Authorization', 'Basic ' + authorizationBasic);
request.setRequestHeader('Accept', 'application/json');
request.send("username=John&password=Smith&grant_type=password&uid=b17ac911-4cf1-4a3e-84a9-beac7b9da157");
jQuery:
$.ajax({
type: 'POST',
url: oAuth.AuthorizationServer,
data: { username: 'John', password: 'Smith', grant_type: 'password', uid: 'b17ac911-4cf1-4a3e-84a9-beac7b9da157' },
dataType: "json",
contentType: 'application/x-www-form-urlencoded; charset=utf-8',
xhrFields: {
withCredentials: true
},
// crossDomain: true,
headers: {
'Authorization': 'Basic ' + authorizationBasic
}
});
我确定这是可能的,但不确定如何实现。我有一个 OWIN OAUTH 实现,它当前接受用户的用户名和密码并根据数据库对它们进行身份验证。我想扩展它以传入智能卡 Uid 以支持使用智能卡进行单点登录。
我可以在 OWIN 登录中传递额外的参数吗?如果可以,如何传递?基本前提是用户可以使用 username/password 组合或智能卡 uid 登录(如果传递智能卡 uid 并且在数据库中找到,则应用程序将使用户登录)
我目前正在传递 username
、password
和 grant_type
,我想将 uid
添加到该列表并在我的 AuthorizationServiceProvider
.
我可以在 OAuthGrantResourceOwnerCredentialsContext
上看到 UserName
、Password
和 ClientId
,但我看不到任何其他可以支持我想要实现的目标的属性。
这是我目前在我的服务提供商中拥有的内容
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
var user = await this._userService.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(ClaimTypes.Sid, user.Id.ToString()));
identity.AddClaim(new Claim(ClaimTypes.Role, "user"));
identity.AddClaim(new Claim("sub", context.UserName));
var secretKeyBytes = Encoding.UTF8.GetBytes(user.PasswordHash);
var props =
new AuthenticationProperties(
new Dictionary<string, string>
{
{ "dm:appid", user.Id.ToString() },
{ "dm:apikey", Convert.ToBase64String(secretKeyBytes) }
});
var ticket = new AuthenticationTicket(identity, props);
context.Validated(ticket);
}
我也希望能够从上下文中获取 Uid,但无论如何都看不到实现这一点,非常感谢任何帮助。
如果您还没有实施,则必须实施 ValidateClientAuthentication
。
这是您验证客户端的地方。
在这种方法中,您将对您的客户端进行某种验证,并设置 objects/variable 可以在 GrantResourceOwnerCredentials
.
Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
收到一个 OAuthValidateClientAuthenticationContext
,其中包含您在 POST 发送到您的授权服务器时传递的附加字段。
在上图中,我在第 4 个位置添加了一个额外的参数 uid
。
在验证上下文之前:
context.Validated(clientId);
你可以设置你的variable/object:
string uid = context.Parameters.Where(f => f.Key == "uid").Select(f => f.Value).SingleOrDefault()[0];
context.OwinContext.Set<string>("SmartCard", uid);
现在,在您的 GrantResourceOwnerCredentials
中,您可以简单地读取值并使用它:
string uid = context.OwinContext.Get<string>("SmartCard");
如果您想了解更多信息,可以看看这个 github repository 我在其中传递了一个对象:
context.OwinContext.Set<ApplicationClient>("oauth:client", client);
如果您下载了整个解决方案,您可以使用 javascript/jquery 客户端对其进行测试。
更新:
您将在您的 http POST 请求中传递一个附加参数(即:uid):
原版 Js:
var request = new XMLHttpRequest();
request.open('POST', oAuth.AuthorizationServer, true);
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
request.setRequestHeader('Authorization', 'Basic ' + authorizationBasic);
request.setRequestHeader('Accept', 'application/json');
request.send("username=John&password=Smith&grant_type=password&uid=b17ac911-4cf1-4a3e-84a9-beac7b9da157");
jQuery:
$.ajax({
type: 'POST',
url: oAuth.AuthorizationServer,
data: { username: 'John', password: 'Smith', grant_type: 'password', uid: 'b17ac911-4cf1-4a3e-84a9-beac7b9da157' },
dataType: "json",
contentType: 'application/x-www-form-urlencoded; charset=utf-8',
xhrFields: {
withCredentials: true
},
// crossDomain: true,
headers: {
'Authorization': 'Basic ' + authorizationBasic
}
});