2017-08-19 31 views
0

我无法找到一种方法如何将应用程序从aspnet核心1.1迁移到2.0使用cookie身份验证。CookieAuthentication和AspNet核心2.0迁移

我已经知道了最有用的资源:

不幸的是,我仍然坚持。下面是我如何做到这一点:
在Startup.cs ConfigureServices(IServiceCollection services)我:

services.AddSingleton<IConfigureNamedOptions<CookieAuthenticationOptions>, CookieAuthenticationOptionsSetup>(); 

及更高版本:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(); 

CookieAuthenticationOptionsSetup类实现IConfigureNamedOptions并设置options.Cookie.Name = "test"Configure方法内。 我的事件试图手动创建并将Name属性设置为“Cookies”。

如果我尝试使用Startup.cs AddCookie方法中的lambda表达式更改cookie的名称,它将按预期工作。但是,如果我不这样做,CookieAuthenticationOptionsSetup从不使用,并使用默认的cookie名称(.AspNetCore.Cookies)。

我缺少什么?

+0

**调用'AddCookie'后,请尝试注册您自定义的'CookieAuthenticationOptions' **。 – poke

+0

我刚刚尝试过。没有成功。 – Zygimantas

回答

1

AddCookie()默认情况下调用AuthenticationBuilder.AddScheme。从这里,我们可以学到如何,如果将其传递给AddCookie通话的选项将被理想登记:

Services.Configure(authenticationScheme, configureOptions); 

所以,让我们一起来看看如何Services.Configure用于指定的选项。服务集合上的ultimately gets registeredIConfigureOptions<CookieAuthenticationOptions>>

所以我想这是在通过DI解决选项时正在查找的确切类型。而实际上,that is the exact type正在由OptionsFactory请求,OptionsMonitor正在使用的是requested by the authentication handler

因此,tl; dr:您正在将您的自定义配置注册为错误的类型。你应该把它注册为IConfigureOptions<>:当然,你CookieAuthenticationOptionsSetup需要实现IConfigureNamedOptions正确和一个Configure呼叫您的方案名称(CookieAuthenticationDefaults.AuthenticationScheme)响应的

services.AddSingleton<IConfigureOptions<CookieAuthenticationOptions>, CookieAuthenticationOptionsSetup>(); 

注意。

+0

是的,你是对的,我不得不实施IConfigureNamed选项,但注册为IConfigureOptions !额外的意见在一个单独的答案。 – Zygimantas

+0

@Zygimantas非常感谢你的额外赏金!这真的没有必要,但是这个姿势更值得赞赏!谢谢,我很高兴你设法让它工作:) – poke

0

这是不完全清楚是什么问题...
但如果你只想设置cookie的名称(或其他选项),真的不需要实现IConfigureNamedOptions尝试这样的事:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options => 
{ 
    options.Cookie.Name = "TestName"; 
} 
+0

设置cookie名称是一个简化示例。我使用单独的类,因为配置对于lambda来说太复杂了。问题是:为什么cookie设置作为一个类没有被注入。 – Zygimantas

1

除了this answer,我还必须将Name属性添加到执行IConfigureNamedOptions<T>的类中,并将其设置为public void Configure(string name, CookieAuthenticationOptions options)方法。对于那些谁都会有同样的问题

另外几个注意事项:

申请Authorize全局属性,认证方案必须加入(以前的工作没有它):

services.AddMvcCore(a => 
{ 
    var policy = new AuthorizationPolicyBuilder().AddAuthenticationSchemes(CookieAuthenticationDefaults.AuthenticationScheme).RequireAuthenticatedUser().Build(); 
    a.Filters.Add(new AuthorizeFilter(policy)); 
}); 

里面使用IsAuthenticated属性在注册中间件之前必须调用中间件app.UseAuthentication()