owin oauth发送其他参数

时间:2015-07-15 22:31:36

标签: c# security authentication oauth owin

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

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

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

我可以在AuthorizationServiceProvider上看到UserNamePasswordClientId,但我看不到任何其他属性可以支持我想要达到的目标。

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

OAuthGrantResourceOwnerCredentialsContext

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

1 个答案:

答案 0 :(得分:46)

如果您还没有这样做,则必须实施ValidateClientAuthentication

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

Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)

收到一个OAuthValidateClientAuthenticationContext,其中包含您在发布到授权服务器时传递的其他字段。

enter image description here

在上图中,我在第4位添加了额外参数uid

在验证上下文之前:

context.Validated(clientId);

您可以设置变量/对象:

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请求中传递一个额外的参数(IE: uid ):

Vanilla 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
    }
});