Опитвам се да внедря удостоверяване и оторизация в приложение MVC 5.1. Удостоверяването се извършва чрез Facebook, който е персонализиран. (Мога да публикувам този код, ако е необходимо.) След като FB удостовери и изпрати обратно кода, се извиква методът Authenticate
на услугата за удостоверяване, за да влезе потребителят в приложението. В самото приложение няма код за удостоверяване (по този начин не се използват услуги за идентичност или други услуги за членство).
public async Task<ActionResult> Connect(string code)
{
if (code == null)
{
return RedirectToAction("Index", "Home");
}
else
{
// get access token
var accessToken = await nApplication.FacebookClient.AccessTokenAsync(code);
// get user info from facebook
var meResult = await nApplication.FacebookClient.MeResultAsync(accessToken);
nApplication.NRepository.SaveChanges();
nAuthorization.Authenticate(member);
return RedirectToAction("Index");
}
}
nAuthorization.Authenticate(member);
създава списък с искове и изпълнява OWIN SignIn
,
claims.Add(new Claim(ClaimTypes.Name, member.Name));
claims.Add(new Claim(ClaimTypes.Role, "Member"));
var claimIdentity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);
owinContext.Authentication.SignIn(new AuthenticationProperties { IsPersistent = true }, claimIdentity);
Използвам атрибута Authorize
от пространството на имената Mvc
. Но в този момент /Profile/Authenticate/
, който е моят Owin LoginPath
get, се извиква отново и отново, за да пренасочи потребителя към FB и да се върне към Connect
метода по-горе.
[Authorize(Roles = "Member")]
public async Task<ActionResult> Index(int? id)
Проверих свойството User
в контролера и то не е удостоверено. Бих могъл да задам това на нов ClaimsPrincipal
, но бих искал кодът за удостоверяване да е независим от HttpContext
. И изглежда не е правилното решение.
Моят Startup
клас съдържа:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
LoginPath = new PathString("/Profile/Authenticate/"),
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
CookieSecure = CookieSecureOption.Always,
ReturnUrlParameter = "next"
});
Може би пропускам нещо напълно фундаментално? Всички указания биха помогнали, прегледах статии като следните, но без резултат: