Aurelia Windows身份验证 - 发布401未经授权

时间:2017-08-15 09:45:30

标签: c# .net asp.net-core aurelia windows-authentication

我完全坚持为我的一个使用Aurelia作为客户端的.NET Core应用程序实现Windows身份验证。

Aurelia应用程序托管在端口:9000 上,.NET WebAPI托管在端口:9001 上。

这个想法是在应用程序发布后从我的.NET应用程序提供静态页面但现在正在开发中我使用 port:9000 ,因为Aurelia提供了BrowserSync。

当我使用端口:9000 时,一切都很好,花花公子,我发布或获取没有任何问题。

如果我切换到端口:9001 我仍然可以获得但不能发布。发布结果为401 Unauthorized

如果我们查看端口:9000 请求的标头..

获取(成功):

enter image description here

发表(失败):

enter image description here

您可以看到由于某些原因,帖子中缺少多个标头,最重要的是身份验证Cookie ..

基Repo.js

import {inject} from 'aurelia-framework';
import {HttpClient, json} from 'aurelia-fetch-client';
import {AppSettings} from '../infrastructure/app-settings';

@inject(HttpClient, AppSettings)

export class BaseRepo {
    constructor(http, appSettings) {
        http.configure(config => {
            config
                .withDefaults({
                    credentials: 'include',
                    headers: {
                        'Accept': 'application/json'
                    }
                })
                .withInterceptor({
                    request(request) {
                        console.log(`Requesting ${request.method} ${request.url}`);
                        return request;
                    },
                    response(response) {
                        console.log(`Received ${response.status} ${response.url}`);
                        return response;
                    }
                })
        });

        this.http = http;
        this.baseUrl = appSettings.api;
    }

    get(url) {
        console.log('BaseRepo(get): ' + url);
        return this.http.fetch(this.baseUrl + url)
            .then(response => { return response.json(); })
            .then(data => { return data; });
    }

    post(url, data) {
        console.log('BaseRepo(post): ' + url, data);
        return this.http.fetch(this.baseUrl + url, {
            method: 'post',
            body: json(data)
        })
            .then(response => response.json())
            .then(data => { return data; });
    }
}

使用BrowserSync端口时,为什么GET正常工作但没有POST?

修改1

发布(成功)端口:9001:

enter image description here

编辑2 控制台消息发布错误:

  

选项http://localhost:9001/api/MYURLS 401 (Unauthorized)

     

无法加载Fetch API   http://localhost:9001/api/MYURLS。   对预检请求的响应未通过访问控制检查:否   请求中存在“Access-Control-Allow-Origin”标头   资源。因此不允许来源“http://localhost:9000”   访问。响应具有HTTP状态代码401.如果是不透明的响应   满足您的需求,将请求的模式设置为'no-cors'来获取   CORS禁用的资源。

编辑3

Startup.cs

public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();
            Configuration = builder.Build();

            env.ConfigureNLog("nlog.config");
        }

        public IConfigurationRoot Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors(options =>
            {
                options.AddPolicy("CorsPolicy",
                    builder => builder.AllowAnyOrigin()
                        .AllowAnyMethod()
                        .AllowAnyHeader()
                        .AllowCredentials());
            });

            services.AddMemoryCache();
            services.AddMvc();

            services.InjectWebServices();

            services.AddOptions();

            //call this in case you need aspnet-user-authtype/aspnet-user-identity
            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

            services.AddSingleton<IConfiguration>(Configuration);
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            app.UseCors("CorsPolicy");

            loggerFactory.AddConsole(Configuration.GetSection("Logging"));

            loggerFactory.AddDebug();

            app.UseMvc();

            app.UseDefaultFiles();

            app.UseStaticFiles();

            //add NLog to ASP.NET Core
            loggerFactory.AddNLog();

            //add NLog.Web
            app.AddNLogWeb();
        }
    }

2 个答案:

答案 0 :(得分:1)

您需要在ASP.NET Core项目中启用CORS。有关如何在此处执行此操作的信息:https://docs.microsoft.com/en-us/aspnet/core/security/cors

您需要在AddCors中致电ConfigureServices

services.AddCors();

然后UseCors中的Configure

// Shows UseCors with CorsPolicyBuilder.
app.UseCors(builder => builder.WithOrigins("http://example.com"));

当您使用端口9000时,您与API的来源不同,但对于9001,您使用相同的来源,因此CORS将不适用。

OPTIONS请求被称为&#34;预检&#34;。有关这些内容的更多信息:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests

答案 1 :(得分:1)

enter image description here

我已启用&#34;启用匿名身份验证&#34;在项目属性和瞧... ...

之前我只有#34;启用Windows身份验证&#34;启用,现在两个端口都可以工作!

当部署应用程序时,无论如何都不会启用它,因为那时我将使用真正的IIS。

更新1

升级到.net core 2.0后,我无法同时启用Windows身份验证和匿名身份验证。 经过一些研究,我发现你必须补充:

services.AddAuthentication(IISDefaults.AuthenticationScheme);
在您的startup.cs中

以使其正常工作。

可在comment部分和docs部分找到更多信息。

更新2

您需要 Microsoft.AspNetCore.Authentication 包作为身份验证构建器。