簡體   English   中英

owin oauth發送附加參數

[英]owin oauth send additional parameters

我確信這是可能的,但不確定如何實現。 我有一個OWIN OAUTH實現,它當前接受用戶的用戶名和密碼,並根據數據庫對它們進行身份驗證。 我想擴展它以通過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<string, string>
                    {
                        { "dm:appid", user.Id.ToString() },
                        { "dm:apikey", Convert.ToBase64String(secretKeyBytes) }
                    });

        var ticket = new AuthenticationTicket(identity, props);
        context.Validated(ticket);
    }

我希望能夠從上下文中獲取Uid,但無論如何都看不到實現這一點,非常感謝任何幫助。

如果尚未執行,則必須實現ValidateClientAuthentication

這是您應該驗證客戶的地方。 在此方法中,您將對客戶端進行某種驗證,並設置可在GrantResourceOwnerCredentials讀取的對象/變量。

Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)

接收OAuthValidateClientAuthenticationContext ,其中包含在OAuthValidateClientAuthenticationContext到授權服務器時傳遞的其他字段。

在此輸入圖像描述

在上面的圖片中,我在第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 存儲庫

context.OwinContext.Set<ApplicationClient>("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
    }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM