web-dev-qa-db-ja.com

owin oauth追加パラメーターを送信

これは可能だと確信していますが、達成方法は定かではありません。現在、ユーザーのユーザー名とパスワードを受け入れ、データベースに対して認証するOWIN OAUTH実装があります。これを拡張して、SmartCard Uidを渡し、スマートカード。

OWINログインで追加のパラメーターを渡すことはできますか?基本的な前提は、ユーザーがユーザー名/パスワードの組み合わせまたはSmartCard uidでログインできることです(SmartCard uidを渡してデータベースで見つかった場合、アプリケーションはユーザーをログインします)

現在、usernamepasswordおよびgrant_typeと私はそのリストにuidを追加し、それをAuthorizationServiceProviderで取得したいと思います。

UserNameにはPasswordClientId、およびOAuthGrantResourceOwnerCredentialsContextが表示されますが、達成しようとしているものをサポートする他のプロパティは表示されません。

これは私が現在私のサービスプロバイダーに持っているものです

    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を取得できるようにしたいのですが、これを達成する方法がわからないので、どんな助けも大歓迎です。

22
Neil Stevens

まだ実装していない場合は、ValidateClientAuthenticationを実装する必要があります。

これは、クライアントを検証する場所です。このメソッドでは、クライアントの何らかの検証を行い、GrantResourceOwnerCredentialsで読み取ることができるオブジェクト/変数を設定します。

Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)

承認サーバーへのPOST時に渡す追加フィールドを含む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クライアントでテストできます。

[〜#〜] update [〜#〜]

追加のパラメーター(IE:uid)をhttp POSTリクエストで渡します:

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
    }
});
46
LeftyX