0

Я использую IdentityServer3 для обработки аутентификации пользователей на веб-сайте asp mvc.IdentityServer3: объединить учетные данные вручную с помощью социальной опции

Экран входа в систему размещен в представлении самого приложения (не использующего неявный поток Identity Server). Я также предлагаю вариант «Войти с Google», который пользователь выбирает, нажав кнопку на экране входа в систему.

Любая страница, которая имеет [Авторизоваться] следует перенаправить неаутентифицированный пользователя на экране входа:

public void Configuration(IAppBuilder app) 
    { 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = "Cookies", 
      LoginPath = new PathString("/Account/Login") 
     }); 
    } 

Счет контура управления показан ниже. Сценарий «Аутентификация форм» будет работать (as described here).

Кнопка «Войти с помощью Google» работает as described here (пропуская страницу входа в ID-сервер, перейдя непосредственно в Google), указав параметр «acr_values».

Как я могу справиться с обратным вызовом из OpenID Connect после входа в систему Google? Я попытался добавить OpenId Connect middleware, но он не очень хорошо работает с функцией «LoginPath» в аутентификации Cookie: теперь пользователи, не прошедшие проверку подлинности, перенаправляются на экран входа в ID Server, а не на мой локальный экран входа.

Я ничего не вижу в IdentityServer samples, который обращается к этому сценарию.

public class AccountController : Controller 
{ 
    [HttpGet] 
    public ActionResult Login() 
    { 
     ViewBag.GoogleLogin = CreateLoginUrl("Google"); 

     return View(); 
    } 

    [HttpPost] 
    public ActionResult Login(LoginViewModel vm) 
    { 
     // Call IdentityServer here with credentials 
     // Validate token and do the Owin Authentication SignIn 
     // Redirect to 'ReturnUrl' 

     // If errors: 
     return View(vm); 
    } 

    public ActionResult Callback() 
    { 
     // What goes here?? 

     return new RedirectResult("/"); 
    } 

    private string CreateLoginUrl(string provider) 
    { 
     var state = Guid.NewGuid().ToString("N"); 
     var nonce = Guid.NewGuid().ToString("N"); 

     var request = new AuthorizeRequest(new Uri("https://localhost:44312/connect/authorize")); 
     var startUrl = request.CreateAuthorizeUrl(
        clientId: "mvc", 
        responseType: "id_token token", 
        scope: "openid profile roles sampleApi", 
        redirectUri: "https://localhost:44319/Account/Callback", 
        state: state, 
        acrValues: "idp:" + provider, 
        nonce: nonce); 

     return startUrl; 
    } 
} 

ответ

0

Я обошел вопрос о конфликтующих поставщиков проверки подлинности с помощью расширения Map IAppBuilder только применить Open Id Connect Middleware к одной конечной точке. Таким образом, поток социального входа полностью обрабатывается промежуточным программным обеспечением, а cookie проверки подлинности используется обоими поставщиками проверки подлинности.

public void Configuration(IAppBuilder app) 
{ 
    app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     AuthenticationType = "Cookies", 
     LoginPath = new PathString("/Account/Login") 
    }); 
    app.Map(new PathString("/Account/SocialLogin"), ctx => 
    { 
     ctx.UseOpenIdConnectAuthentication(Options()); 
    }); 
} 

И AccountController бит:

public class AccountController : Controller 
{ 
    [HttpGet] 
    public ActionResult Login(string returnUrl) 
    { 
     return View(new LoginViewModel { ReturnUrl = returnUrl }); 
    } 

    [HttpPost] 
    public async Task<ActionResult> Login(LoginViewModel vm) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(vm); 
     } 

     // Call IdentityServer here with credentials 
     TokenResponse token = await GetToken(vm.UserName, vm.Password); 

     // Validate token and do the Owin Authentication SignIn 
     // Redirect to 'ReturnUrl' 

     await SignInAsync(token); 

     return new RedirectResult(vm.ReturnUrl); 
    } 

    [Authorize] 
    public ActionResult SocialLogin(string returnUrl) 
    { 
     return new RedirectResult(returnUrl); 
    } 

    // Some helpers omitted 
}