|
|
@ -20,14 +20,10 @@ using UAParser;
|
|
|
|
namespace AuthStudy.Authentication.Browser
|
|
|
|
namespace AuthStudy.Authentication.Browser
|
|
|
|
{
|
|
|
|
{
|
|
|
|
/// <summary>
|
|
|
|
/// <summary>
|
|
|
|
/// 浏览器认证处理器:基于默认类型实现
|
|
|
|
/// 浏览器认证处理器:基于默认基类实现
|
|
|
|
/// </summary>
|
|
|
|
/// </summary>
|
|
|
|
public class BrowserAuthenticationHandler : AuthenticationHandler<BrowserAuthenticationOptions>
|
|
|
|
public class BrowserAuthenticationHandler : AuthenticationHandler<BrowserAuthenticationOptions>
|
|
|
|
{
|
|
|
|
{
|
|
|
|
public string DefaultSchemeName = BrowserAuthenticationDefault.SchemeName;
|
|
|
|
|
|
|
|
public HttpContext? CurrentHttpContext;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public BrowserAuthenticationHandler
|
|
|
|
public BrowserAuthenticationHandler
|
|
|
|
(
|
|
|
|
(
|
|
|
|
IOptionsMonitor<BrowserAuthenticationOptions> options,
|
|
|
|
IOptionsMonitor<BrowserAuthenticationOptions> options,
|
|
|
@ -52,7 +48,7 @@ namespace AuthStudy.Authentication.Browser
|
|
|
|
properties.Items.Add("AuthenticationBrowser", "浏览器认证属性");
|
|
|
|
properties.Items.Add("AuthenticationBrowser", "浏览器认证属性");
|
|
|
|
|
|
|
|
|
|
|
|
//获取请求浏览器信息,如果请头重复则以后面的为准
|
|
|
|
//获取请求浏览器信息,如果请头重复则以后面的为准
|
|
|
|
var userAgent = CurrentHttpContext?.Request.Headers["User-Agent"].LastOrDefault();
|
|
|
|
var userAgent = Context.Request.Headers["User-Agent"].LastOrDefault();
|
|
|
|
if (userAgent == null)
|
|
|
|
if (userAgent == null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
properties.UpdateTokenValue("AuthenticationBrowser", "失败:获取不到浏览器信息");
|
|
|
|
properties.UpdateTokenValue("AuthenticationBrowser", "失败:获取不到浏览器信息");
|
|
|
@ -101,13 +97,13 @@ namespace AuthStudy.Authentication.Browser
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
//身份:包含声明集合,是声明集合的包装类,一个身份对应多个声明
|
|
|
|
//身份:包含声明集合,是声明集合的包装类,一个身份对应多个声明
|
|
|
|
var claimsIdentity = new ClaimsIdentity(Claims, DefaultSchemeName);
|
|
|
|
var claimsIdentity = new ClaimsIdentity(Claims, Scheme.Name);
|
|
|
|
|
|
|
|
|
|
|
|
//当事人/主角:是身份Identity的包装,对应多个身份
|
|
|
|
//当事人/主角:是身份Identity的包装,对应多个身份
|
|
|
|
var claimsPrincipal = new ClaimsPrincipal(claimsIdentity);
|
|
|
|
var claimsPrincipal = new ClaimsPrincipal(claimsIdentity);
|
|
|
|
|
|
|
|
|
|
|
|
//票据:对Principal的包装,一对一
|
|
|
|
//票据:对Principal的包装,一对一
|
|
|
|
var ticket = new AuthenticationTicket(claimsPrincipal, DefaultSchemeName);
|
|
|
|
var ticket = new AuthenticationTicket(claimsPrincipal, Scheme.Name);
|
|
|
|
|
|
|
|
|
|
|
|
//认证结果:认证信息会写入 当前请求的 User属性中,供下一个授权中间件使用
|
|
|
|
//认证结果:认证信息会写入 当前请求的 User属性中,供下一个授权中间件使用
|
|
|
|
result = AuthenticateResult.Success(ticket);
|
|
|
|
result = AuthenticateResult.Success(ticket);
|
|
|
@ -125,26 +121,17 @@ namespace AuthStudy.Authentication.Browser
|
|
|
|
{
|
|
|
|
{
|
|
|
|
properties?.Parameters.Add("x-itme", "无效的认证");
|
|
|
|
properties?.Parameters.Add("x-itme", "无效的认证");
|
|
|
|
|
|
|
|
|
|
|
|
if (CurrentHttpContext != null)
|
|
|
|
Context.Response.StatusCode = 401;
|
|
|
|
|
|
|
|
if (Context?.Response.Body.CanWrite ?? false)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
CurrentHttpContext.Response.StatusCode = 401;
|
|
|
|
var msg = UTF8Encoding.UTF8.GetBytes("认证无效");
|
|
|
|
if (CurrentHttpContext?.Response.Body.CanWrite ?? false)
|
|
|
|
var t = Context!.Response.Body.WriteAsync(msg);
|
|
|
|
{
|
|
|
|
|
|
|
|
var msg = UTF8Encoding.UTF8.GetBytes("认证无效");
|
|
|
|
|
|
|
|
var t = CurrentHttpContext!.Response.Body.WriteAsync(msg);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
CurrentHttpContext!.Items.Add("认证结束时间", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Context!.Items.Add("认证结束时间", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
|
|
|
|
|
|
|
|
|
|
|
|
return Task.CompletedTask;
|
|
|
|
return Task.CompletedTask;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected override Task InitializeHandlerAsync()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
CurrentHttpContext = base.Context;
|
|
|
|
|
|
|
|
return base.InitializeHandlerAsync();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static bool IsMobile(string deviceInfo)
|
|
|
|
private static bool IsMobile(string deviceInfo)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
bool isMobile = false;
|
|
|
|
bool isMobile = false;
|
|
|
|