gpt4 book ai didi

asp.net-web-api2 - SwashBuckle/Swagger - OAuth 资源所有者密码流程

转载 作者:行者123 更新时间:2023-12-03 04:18:58 24 4
gpt4 key购买 nike

我正在尝试将 swagger 实现到我的 Asp.Net Web API 中,但遇到了问题。

我正在使用密码资源所有者流程,并且我必须添加解决方法才能执行此操作,这在以下堆栈溢出问题中有所介绍:-

Swagger/Swashbuckle: OAuth2 with Resource Owner Password Credentials Grant

我已经一切正常,承载 token 通过 javascript 添加到当前浏览器窗口中的请求 header ,但对需要授权的 Controller 方法的 api 调用仍然返回“401 - 授权失败”。

这是获取不记名 token 并添加 header 的 JavaScript:-

 $('#input_apiKey').change(function () {
var key = $('#input_apiKey')[0].value;
var credentials = key.split(':'); //username:password expected
$.ajax({
url: "http://localhost:42291/token",
type: "post",
contenttype: 'x-www-form-urlencoded',
data: "grant_type=password&username=" + credentials[0] + "&password=" + credentials[1],
success: function (response) {
var bearerToken = 'Bearer ' + response.access_token;

window.swaggerUi.api.clientAuthorizations.add('Authorization', new window.SwaggerClient.ApiKeyAuthorization('Authorization', bearerToken, 'header'));
window.swaggerUi.api.clientAuthorizations.remove('api_key');

alert("Login Succesfull!");
},
error: function (xhr, ajaxoptions, thrownerror) {
alert("Login failed!");
}
});
});

Swagger 响应中的 Curl 是:-

curl -X GET --header "Accept: application/json" --header "Authorization: Bearer NqlSG-WyTx2zkYE8xFklGyZWlQDZdsCKZBHruEXvX47N7PAzw4-jZ4eH5D0yFzQTXj13RwKFFt1rUZt2fzWj1vR5UR87wdlKC3YvsTojYV4-3DsWwY7qYRfiKPuM0j09c3X5lnrtlBVJ1rBRUH0TLjfw_yGxgoLBwOJl9xyC1YWNoPOe2nzL4lMOHodAnMem0IBMJmUo3Rt575tnWAbBsQXWhlImDIxCZXvkZdJtlXfIfBSUdY9gfRWL0ZjKbf7m2-yLzH0gpMAMuKaADmJlIudJc0d4SP1Nn2Kh2HuVH8CX4QgZuu4egl9N6rY2smorP2vBSC4_dC4CpmYYzOTu2wUnUhHDY2Q6NWl377ijDKwZLcW9jtD-2tBiEGmFuRV0mVGnh0zc4w9Ao9jPCdtrbSyGitgloBW-UG2bfyao3eE" "http://localhost:42291/api/v1/claims"

我根本看不出这有什么问题。

然后,我使用 Postman 调用完全相同的 URL 调用,使用在 javascript 调用中生成的相同访问 token ...

你猜怎么着......它工作得很好。

编辑

我尝试从 Controller 中删除授​​权属性,以便我可以在请求到达 Controller 方法时检查请求。

查看请求 header ,Authorization 属性为 null。

不知道这是为什么。 CURL 建议将其放入请求中。

编辑2

我已经包含了我的安全定义:-

"securityDefinitions": {
"oauth2": {
"type": "oauth2",
"description": "OAuth2 Password Grant",
"flow": "password",
"tokenUrl": "http://localhost:42291/token",
"scopes": {}
}
}

编辑3当直接在命令行中通过 cURL 公开时,此 api 调用的 Swagger UI 中显示的 cURL 可以正常工作。

现在我完全困惑了。

最佳答案

我已经成功解决了这个问题。这是一个简单的类型不匹配,导致我悲伤了好几天。

在 onComplete.JS 中,我需要创建一个与 swagger 规范中提供的 key 相匹配的 key 。

如果您检查上面的代码片段,您会发现我创建了一个 key 并将其称为“授权”。但这与命名的安全定义“oauth2”不匹配。

工作代码:-

$('#input_apiKey').change(function () {
var key = $('#input_apiKey')[0].value;
var credentials = key.split(':');
$.ajax({
url: "http://localhost:42291/token",
type: "post",
contenttype: 'x-www-form-urlencoded',
data: "grant_type=password&username=" + credentials[0] + "&password=" + credentials[1],
success: function (response) {

var bearerToken = "Bearer " + response.access_token;

window.swaggerUi.api.clientAuthorizations.remove('api_key');

var apiKeyAuth = new SwaggerClient.ApiKeyAuthorization("Authorization", bearerToken, "header");

window.swaggerUi.api.clientAuthorizations.add('oauth2', apiKeyAuth);

alert("Login Succesfull!");

},
error: function (xhr, ajaxoptions, thrownerror) {
alert("Login failed!");
}
});
});

为了进一步解释这一点,您需要创建 IOperationFilter 的实现,以便 swagger 可以确定 api 的哪些方法需要授权。正确配置后,您应该会在 swagger 规范中看到针对每个 api 调用的安全定义:-

enter image description here

我的 IOperationFilter 实现:-

public class AssignOAuth2SecurityRequirements : IOperationFilter
{
/// <summary>
/// Apply Security Measures.
/// </summary>
/// <param name="operation"></param>
/// <param name="schemaRegistry"></param>
/// <param name="apiDescription"></param>
/// <exception cref="NotImplementedException"></exception>
public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
{
// Determine if the operation has the Authorize attribute
var authorizeAttributes = apiDescription.ActionDescriptor.GetCustomAttributes<AuthorizeAttribute>();

if (!authorizeAttributes.Any())
return;

// Initialize the operation.security property
if (operation.security == null)
operation.security = new List<IDictionary<string, IEnumerable<string>>>();

// Add the appropriate security definition to the operation
var oAuthRequirements = new Dictionary<string, IEnumerable<string>>
{
{ "oauth2", Enumerable.Empty<string>() }
};

operation.security.Add(oAuthRequirements);
}
}

关于asp.net-web-api2 - SwashBuckle/Swagger - OAuth 资源所有者密码流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34929280/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com