CookieAuthentication和AspNet Core 2.0迁移

时间:2017-08-19 10:27:36

标签: c# asp.net-mvc cookies asp.net-core migration

我找不到如何将应用程序从aspnet核心1.1迁移到使用cookie身份验证的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属性设置为&#34; Cookies&#34;。

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

我缺少什么?

3 个答案:

答案 0 :(得分:2)

AddCookie()默认情况下会调用AuthenticationBuilder.AddScheme。从那里,我们可以了解如果您将选项传递给AddCookie电话,理想情况下如何注册选项:

Services.Configure(authenticationScheme, configureOptions);

让我们来看看Services.Configure如何使用命名选项。服务集合上的ultimately gets registeredIConfigureOptions<CookieAuthenticationOptions>>

所以我猜这是通过DI解决选项后正在查找的确切类型。实际上OptionsFactory OptionsMonitor正在IConfigureOptions<>请求that is the exact type requested by the authentication handler。{/}

所以,tl; dr:您正在将自定义配置注册为错误的类型。您应该将其注册为services.AddSingleton<IConfigureOptions<CookieAuthenticationOptions>, CookieAuthenticationOptionsSetup>();

CookieAuthenticationOptionsSetup

当然请注意,Configure需要正确实施IConfigureNamedOptions,并使用您的计划名称(CookieAuthenticationDefaults.AuthenticationScheme)回复 @EqualsAndHashCode(exclude = "husband",callSuper = false) @Entity @Table(name = "t_wife") public class Wife { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; @OneToOne(mappedBy = "wife",cascade = {CascadeType.ALL}) @JsonIgnore private Husband husband; //omitted getter/setter } 来电。

答案 1 :(得分: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()

答案 2 :(得分:0)

目前尚不清楚问题是什么......
但是,如果您只想设置cookie名称(或其他选项)并且实际上不需要实现IConfigureNamedOptions,请尝试以下方法:

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