Я создаю приложение Asp.NET MVC 5. Для этого проекта я пытаюсь реализовать собственный механизм аутентификации (я не хочу использовать аутентификацию с помощью форм/OWIN и т. д. внешних поставщиков).
Я создал собственный атрибут авторизации следующим образом:
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class myAuthorize : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (!HttpContext.Current.Request.IsAuthenticated)
{
httpContext.Response.Redirect("~/Account/Login");
}
return base.AuthorizeCore(httpContext);
}
}
И в моем действии входа я пытаюсь изменить значение
HttpContext.User.Identity.IsAuthenticated
Но он доступен только для чтения, и я не могу изменить значение. Могу ли я изменить его значение вручную или я делаю логическую ошибку.
Да, это отличная статья, но она охватывает полную замену провайдера, что на самом деле превышает мои знания по этой теме. Но я буду иметь это в виду. Спасибо.
@emumcu помог ли какой-нибудь из приведенных ниже ответов? Голосование или принятый ответ действительно помогут.





вы не можете использовать FormsAuthentication.SetAuthCookie?
Конечно, это одно из возможных решений, но я предпочитаю его не использовать.
Мой ответ может не подойти вам идеально, но он может помочь. В моем приложении ASP.NET Core MVC администраторам необходимо выдавать себя за других пользователей. Это приложение для интрасети, и, очевидно, пользователи аутентифицируются с помощью аутентификации Windows. Это делается благодаря ajax-запросу к этому действию контроллера:
public async Task<JsonResult> UserImpersonation(IdentityExtension userIdentity)
IdentityExtension — это пользовательский класс, подпись которого вы можете увидеть ниже:
public class IdentityExtension : IIdentity
{
public IdentityExtension()
{ }
public IdentityExtension(string name)
{
this.Name = name;
}
public string AuthenticationType => "Kerberos";
public bool IsAuthenticated => true;
public string Name { get; set; }
}
Метод UserImpersonation возвращает состояние успеха метода ReplaceUser, который обновляет HttpContext.User следующим образом:
this.HttpContext.User = identity as ClaimsPrincipal;
return true;
identity является экземпляром IdentityExtension.
Я надеюсь, что мое решение может быть адаптировано к вашему варианту использования!
Вы можете добиться этого, вручную настроив HttpContext.User:
var identity = new ClaimsIdentity("Custom");
HttpContext.User = new ClaimsPrincipal(identity);
Важно установить обычай authenticationType. В приведенном выше примере я просто использовал строку «Пользовательский», но это может быть что угодно.
При этом HttpContext.User.Identity.IsAuthenticated будет true.
Для чего-то более сложного вы можете добавить такие утверждения:
var identity = new ClaimsIdentity(new List<Claim>
{
new Claim("UserId", "123", ClaimValueTypes.Integer32)
}, "Custom");
HttpContext.User = new ClaimsPrincipal(identity);
Это приводит к:
HttpContext.User.Identity.IsAuthenticated == true;
int.Parse(((ClaimsIdentity)HttpContext.User.Identity).ValueFromType("UserId")) == 123;
Я пытался установить Identity.Name, и если хотите, вот как это сделать: создайте претензию как new Claim(ClaimTypes.Name, "TheNameYouWant")
Мы видим из исходного кода:
/// <summary>
/// Gets a value that indicates if the user has been authenticated.
/// </summary>
public virtual bool IsAuthenticated
{
get { return !string.IsNullOrEmpty(_authenticationType); }
}
поэтому это означает, что когда у нас есть нулевой _authenticationType, IsAuthenticated всегда будет ложным; в противном случае это будет правдой.
Если вы хотите, чтобы HttpContext сохранялся и впоследствии мог получать утверждения, выполните следующие действия. Я буду использовать Cookie Authentication в качестве authenticationType.
var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme, ClaimTypes.Name, ClaimTypes.Role);
identity.AddClaim(new Claim(ClaimTypes.Name, TempData["Username"].ToString()));
var principal = new ClaimsPrincipal(identity);
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal, new AuthenticationProperties { IsPersistent = true });
Полезен ли docs.microsoft.com/en-us/aspnet/identity/overview/extensibility/…?