我們有 3 個應用程式(桌面、移動、Excel 插件),這意味著 3 個客戶端 ID,需要呼叫我們的 API。
是否可以將我們的 API 配置為使用這 3 個客戶端 ID?這是當前配置:
string OidcAuthority = Config.OidcAuthority;
string OidcRedirectUrl = Config.OidcRedirectUrl;
string OidcClientId = Config.OidcClientId;
string OidcClientSecret = Config.OidcClientSecret;
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
var oidcOptions = new OpenIdConnectAuthenticationOptions
{
Authority = OidcAuthority,
ClientId = OidcClientId,
ClientSecret = OidcClientSecret,
PostLogoutRedirectUri = OidcRedirectUrl,
RedirectUri = OidcRedirectUrl,
ResponseType = OpenIdConnectResponseType.Code,
Scope = OpenIdConnectScope.OpenId
};
app.UseOpenIdConnectAuthentication(oidcOptions);
編輯:
這是我們使用 oauth2 和 Auth0 服務時的代碼。
var domain = Config.Domain;
var apiIdentifier = Config.ApiIdentifier;
var keyResolver = new OpenIdConnectSigningKeyResolver(domain);
app.UseJwtBearerAuthentication(
new JwtBearerAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
TokenValidationParameters = new TokenValidationParameters()
{
ValidAudience = apiIdentifier,
ValidIssuer = domain,
IssuerSigningKeyResolver = (token, securityToken, kid, parameters) => keyResolver.GetSigningKey(kid)
}
});
我知道我必須使用類似的東西,但我有 3 個可能的應用程式可以生成令牌,這意味著 3 個可能的受眾......我應該怎么做?
編輯2:
這是在桌面應用程式(Ext JS)中獲取訪問令牌的代碼:
userLogin: function(){
let deferred = new Ext.Deferred();
let self = this;
if (window.location.href.indexOf("#id_token") >= 0) {
return self.processLoginResponse(deferred, self);
}
var settings = {
authority: 'https://' ONELOGIN_SUBDOMAIN '.onelogin.com/oidc/2',
client_id: ONELOGIN_CLIENT_ID,
redirect_uri: window.location.origin,
response_type: 'id_token token',
scope: 'openid profile',
filterProtocolClaims: true,
loadUserInfo: true
};
var mgr = new Oidc.UserManager(settings);
mgr.signinRedirect({state:'some data'}).then(function() {
deferred.resolve("signin redirect");
}).catch(function(err) {
deferred.reject(err);
});
return deferred.promise;
},
processLoginResponse: function(deferred, self){
var settings = {
authority: 'https://' ONELOGIN_SUBDOMAIN '.onelogin.com/oidc/2',
client_id: ONELOGIN_CLIENT_ID,
redirect_uri: window.location.origin,
response_type: 'id_token token',
scope: 'openid profile',
filterProtocolClaims: true,
loadUserInfo: true
};
var mgr = new Oidc.UserManager(settings);
mgr.signinRedirectCallback().then(function(user) {
Ext.Ajax.setDefaultHeaders({ 'Authorization': 'Bearer ' user.id_token });
deferred.resolve("user signed in");
}).catch(function(err) {
console.log(err);
deferred.reject(err);
});
return deferred.promise;
}
uj5u.com熱心網友回復:
網站 v API 技術堆疊
您使用的技術堆疊是為網站設計的。加載 HTML 頁面時,如果沒有有效的身份驗證 cookie,用戶會被突然重定向到登錄。
相反,本機客戶端通過直接 HTTP 請求呼叫 API,上面的堆疊會嘗試重定向這些請求,這將是錯誤的行為。
相反,本機應用程式應該各自實作自己的 OIDC 流程,以使用自己的客戶端 ID 獲取訪問令牌。RFC8252標準描述了這些流程。API 不需要知道呼叫者的客戶端 ID。
API 技術堆疊行為
可以并且通常建議對多個相關客戶端使用相同的 API。如果使用 C#,API 通常使用以下選項,其中 API 會在每個請求上驗證 JWT 訪問令牌:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = Config.Authority;
options.Audience = Config.Audience;
});
這是您為了使用它而包含的 Microsoft 軟體包:
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.10" />
通常,權限是您的授權服務器的基本 URL,而受眾是您定義的一個值,用于表示一個或多個相關 API:
authority: https://login.example.com
audience: api.example.com
如果需要,具有相同受眾的 API 可以將 JWT 轉發給彼此,以便它們都可以以相同的方式授權請求。Microsoft 安全堆疊將從授權服務器下載并快取令牌簽名公鑰,然后使用它以數字方式驗證收到的訪問令牌并構建 ClaimsPrincipal。
驗證 JWT 后,您還可以信任它發出的宣告并根據它們進行授權,例如通過定義如下授權策略:
services.AddAuthorization(options =>
{
options.AddPolicy("myPolicy", policy =>
policy.RequireAssertion(context =>
context.User.HasClaim(claim =>
claim.Type == "myClaim" && claim.Value == "myValue
)
)
);
});
在邏輯級別編碼授權的一種方法是讓您的控制器應用 Authorize 屬性以應用策略:
[HttpGet("/api/resource")]
[Authorize(Policy = "myPolicy")]
public IActionResult GetResource()
{
return Ok(new { data = "My data" });
}
.NET 框架中的 JWT 驗證
在較舊的 .NET 框架中,概念是相同的,唯一的區別是授權屬性的作業方式可能略有不同。以下是驗證 JWT 的方式,其中 Issuer / Authority 仍然代表授權服務器的基本 URL:
app.UseJwtBearerAuthentication(
new JwtBearerAuthenticationOptions
{
TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = true,
ValidateAudience = true,
ValidIssuer = Config.Issuer;
ValidAudience = Config.Audience;
}
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/520718.html
標籤:。网验证开放式连接
上一篇:next-authGET/api/auth/session400CLIENT_FETCH_ERROR意外令牌“E”(Netlify部署)
