我找不到如何将应用程序从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)。
我缺少什么?
答案 0 :(得分:2)
AddCookie()
默认情况下会调用AuthenticationBuilder.AddScheme
。从那里,我们可以了解如果您将选项传递给AddCookie
电话,理想情况下如何注册选项:
Services.Configure(authenticationScheme, configureOptions);
让我们来看看Services.Configure
如何使用命名选项。服务集合上的ultimately gets registered为IConfigureOptions<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";
}