gpt4 book ai didi

asp.net-web-api - ASP.NET WEB API 2 OWIN 身份验证不受支持 grant_Type

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

嗨,我正在尝试在我的 ASP.NET Web API 2 项目中设置 OAuth 不记名 token 身份验证。
我有两个项目,一个是 WEB API 项目,另一个是 SPA 项目。

这是我到目前为止所做的:

我创建了 OWIN 启动类:

[assembly: OwinStartup(typeof(CodeArt.WebApi.App_Start.Startup))]

namespace CodeArt.WebApi.App_Start

{
public class Startup
{
static Startup()
{
PublicClientId = "self";

UserManagerFactory = () => new UserManager<UserModel>(new UserStore<UserModel>());

OAuthOptions = new OAuthAuthorizationServerOptions {
TokenEndpointPath = new PathString("/Token"),
Provider = new OAuthAuthorizatonServer(PublicClientId, UserManagerFactory),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = true
};
}

public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }

public static Func<UserManager<UserModel>> UserManagerFactory { get; set; }

public static string PublicClientId { get; private set; }
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
}

public void ConfigureAuth(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalBearer);
app.UseOAuthBearerTokens(OAuthOptions);
}
}

我已将 Web API 配置为仅使用不记名 token 身份验证:
    private static void ConfigureBearerTokenAuthentication(HttpConfiguration config)
{
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(Startup.OAuthOptions.AuthenticationType));

}

我已经配置了 WEB API 来支持 CORS:
    private static void ConfigureCrossOriginResourseSharing(HttpConfiguration config)
{
var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);
}

我已经创建了 OAuthAuthorizationServerProvider 类。从这个类我只设法让我的代码调用这个方法:
   public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
if(context.ClientId == null)
{
context.Validated();
}

return Task.FromResult<object>(null);
}

它里面的 if 条件总是被执行。

在我的水疗项目中,我有以下内容:

这是我的 View 模型:
 var vm = {
grant_type: "password",
userName: ko.observable(),
password: ko.observable()
};

当登录按钮被点击时,我调用这个函数:
     var http = {
post:function(url, data) {
return $.ajax({
url: url,
data: data,
type: 'POST',
contentType: 'application/json',
dataType: 'jsonp'
});
}
}

function loginClick() {
var model = ko.mapping.toJS(vm.loginModel);
var rez = $.param(model);

http.post("http://localhost:3439/Token", rez)
.done(function (data) {
console.log(data);
})
.fail(function(eror, stuff, otherstuff) {
console.log(eror);
console.log(stuff);
console.log(otherstuff);
});
}

我的第一次尝试将 post 调用 dataType 设置为 json,但出现以下错误:

OPTIONS ...:3439/Token 400 (Bad Request) jquery.js:7845

OPTIONS ...:3439/Token No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin '...:3304' is therefore not allowed access. jquery.js:7845

XMLHttpRequest cannot load ...3439/Token. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin '...3304' is therefore not allowed access.



3 个点代表 http://localhost .

第二次我将它的数据类型设置为 jsonp,我得到一个错误,指出不受​​支持的“unsupported_grant_type”。

这两个调用都进行了我上面提到的 ValidateClientAuthentication ,但它们都作为失败的请求发回。

现在我猜测问题更多地与我如何发送数据而不是grand_type有关,因为Visual Studion中的SPA模板将授予类型设置为grant_type:“密码”,就像我一样。

另外我已经读到我必须序列化数据而不是在 json 中发送它才能在这里工作是发送的确切 json 序列化数据:
“grant_type=password&userName=aleczandru&password=happynewYear& moduleId =models%2FappPostModels%2FloginModel”

模型 id 属性 get 由 Durandal Framework 设置为我的 SPA 模板中的所有对象。

谁能告诉我我做错了什么我过去两天一直在努力解决这个问题?

最佳答案

将以下代码行添加到 GrantResourceOwnerCredentials ,这会将 header 添加到响应中。

context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

更多信息请引用:
web-api-2-0-cors-and-individual-account-identity

关于asp.net-web-api - ASP.NET WEB API 2 OWIN 身份验证不受支持 grant_Type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21971190/

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