ASP.NET WEB API 2 OWIN身份验证unfported grant_Type

ale*_*dru 6 asp.net-web-api asp.net-web-api2

您好我正在尝试在我的ASP.NET Web API 2项目中设置OAuth bearrer令牌身份验证.我有两个项目,一个是WEB API项目,另一个是SPA项目.

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

我创建了OWIN Startup类:

[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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我已将Web API配置为仅使用承载令牌身份验证:

    private static void ConfigureBearerTokenAuthentication(HttpConfiguration config)
    {
        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(Startup.OAuthOptions.AuthenticationType));

    }
Run Code Online (Sandbox Code Playgroud)

我已经配置了WEB API来支持CORS:

    private static void ConfigureCrossOriginResourseSharing(HttpConfiguration config)
    {
        var cors = new EnableCorsAttribute("*", "*", "*");
        config.EnableCors(cors);
    }
Run Code Online (Sandbox Code Playgroud)

我创建了OAuthAuthorizationServerProvider类.从这个类我只设法让我的代码调用这个方法:

   public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
    {
        if(context.ClientId == null)
        {
            context.Validated();
        }

        return Task.FromResult<object>(null);
    }
Run Code Online (Sandbox Code Playgroud)

内部的if条件总是被执行.

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

这是我的viewModel:

 var vm = {
        grant_type: "password",
        userName: ko.observable(),
        password: ko.observable()
};
Run Code Online (Sandbox Code Playgroud)

单击登录按钮后,我调用此函数:

     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);
            });
    }
Run Code Online (Sandbox Code Playgroud)

我设置帖子的第一次尝试调用dataType为json,我得到了这个错误:

选项......:3439 /令牌400(错误请求)jquery.js:7845

选项...:3439 /令牌否请求资源上存在"Access-Control-Allow-Origin"标头.原因'...:3304'因此不允许访问.的jquery.js:7845

XMLHttpRequest无法加载... 3439/Token.请求的资源上不存在"Access-Control-Allow-Origin"标头.因此,不允许来源"... 3304".

3个点代表http://localhost.

第二次arround我将它的数据类型设置为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"

Durandal Framework将模型ID属性设置为我的SPA模板中的所有对象.

任何人都能告诉我我做错了什么我过去两天一直试图解决这个问题吗?

Oma*_*ani 17

添加以下代码行GrantResourceOwnerCredentials,将标题添加到响应中.

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

有关更多信息,请参阅: web-api-2-0-cors-and-individual-account-identity

  • 我通过使用app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll)找到了另一个解决方案; (9认同)

Elg*_*des 8

就像Robin Karlsson所说,你应该使用:

app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
Run Code Online (Sandbox Code Playgroud)

在您的启动配置中.

并确保它是唯一的cors语句(不要混合它们)和Startup中的第一个语句.