owin oauth发送其他参数

我确信这是可能的,但不确定如何实现。 我有一个OWIN OAUTH实现,它当前接受用户的用户名和密码,并根据数据库对它们进行身份validation。 我想扩展它以通过SmartCard Uid来支持使用SmartCard进行单点登录。

我可以在OWIN登录中传递其他参数吗?如果是,如何传递? 基本前提是用户可以使用用户名/密码组合或SmartCard uid登录(如果通过SmartCard uid并且在数据库中找到,则应用程序将登录用户)

我目前正在传递usernamepasswordgrant_type ,我想将uid添加到该列表中并在我的AuthorizationServiceProvider选择它。

我可以在OAuthGrantResourceOwnerCredentialsContext上看到UserNamePasswordClientId ,但我看不到任何其他属性可以支持我想要实现的内容。

这是我目前在我的服务提供商中所拥有的

  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 { { "dm:appid", user.Id.ToString() }, { "dm:apikey", Convert.ToBase64String(secretKeyBytes) } }); var ticket = new AuthenticationTicket(identity, props); context.Validated(ticket); } 

我希望能够从上下文中获取Uid,但无论如何都看不到实现这一点,非常感谢任何帮助。

如果尚未执行,则必须实现ValidateClientAuthentication

这是您应该validation客户的地方。 在这种方法中,您将对客户端进行某种validation,并设置可在GrantResourceOwnerCredentials读取的对象/变量。

 Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 

接收OAuthValidateClientAuthenticationContext ,其中包含在OAuthValidateClientAuthenticationContext到授权服务器时传递的其他字段。

在此处输入图像描述

在上面的图片中,我在第4位添加了一个额外的参数uid

在validation上下文之前:

 context.Validated(clientId); 

你可以设置你的变量/对象:

 string uid = context.Parameters.Where(f => f.Key == "uid").Select(f => f.Value).SingleOrDefault()[0]; context.OwinContext.Set("SmartCard", uid); 

现在,在GrantResourceOwnerCredentials您只需读取值并使用它:

 string uid = context.OwinContext.Get("SmartCard"); 

如果你想了解更多,你可以看一下我传递一个对象的github 存储库 :

 context.OwinContext.Set("oauth:client", client); 

如果您下载整个解决方案,您可以使用javascript / jquery客户端进行测试。

更新

您将在http POST请求中传递一个附加参数(IE: 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 } });