Достъп до конфигурирани CookieAuthenticationOptions.LoginPath извън Startup.Auth.cs

Използвам удостоверяване на бисквитки с OWIN в настройка на .NET MVC 4.5. Настроих конфигурацията за удостоверяване на бисквитки в Startup.Auth.cs (код по-долу) и бих искал да получа достъп до LoginPath, който задавам в CookieAuthenticationOptions в контролер, така че ако по някаква причина моят LoginPath се промени, трябва само да променя то на едно място. Така че просто търся нещо като

context.GetCookieAuthenticationOptions().LoginPath
Има ли начин за достъп до CookieAuthenticationOptions извън Startup.Auth.cs или единствената ми опция тук е да направя нещо като добавяне на appSetting в Web.config и след това да го използвам вместо това?

Startup.Auth.cs код, бих искал да получа достъп до LoginPath извън този файл.

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("Login"),
            SlidingExpiration = true,
            ExpireTimeSpan = _expirationTimeSpan,
            Provider = new CookieAuthenticationProvider
            {
                // Enables the application to validate the security stamp when the user logs in.
                // This is a security feature which is used when you change a password or add an external login to your account.  
                OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                    validateInterval: TimeSpan.FromMinutes(30),
                    regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager, DefaultAuthenticationTypes.ApplicationCookie))
            },

        });

person EJay    schedule 15.01.2015    source източник
comment
Също така се интересувам как правите това в .NET Core, ако се е променило. Добавих наградата, опитвайки се да разбера това.   -  person Scott Chamberlain    schedule 02.05.2017
comment
@ScottChamberlain защо не просто да имате пътя като опция, която се предава/инжектира към стартирането, което също е достъпно външно чрез същия клас/услуга. Или прекалено опростявам разбирането си за това, което искате да получите достъп.   -  person Nkosi    schedule 03.05.2017
comment
@ScottChamberlain това или CookieAuthenticationOptions да бъде капсулиран в нещо като фабрика, която ще ви даде достъп до екземпляра, който е бил предаден на междинния софтуер.   -  person Nkosi    schedule 03.05.2017


Отговори (1)


Няма пряк начин да направите това. Ако се вгледате внимателно, обектът с опции за бисквитки се съхранява в колекцията AppBuilder class private _middleware. Няма начин за достъп до това свойство (освен отражение).

Можете обаче да съхраните обекта cookieOptions в контекста на Owin:

var cookieOptions = new CookieAuthenticationOptions
{
    // ...
    LoginPath = new PathString("/Account/Login"),
    // ...
};

app.UseCookieAuthentication(cookieOptions);
app.CreatePerOwinContext(() => new MyCookieAuthOptions(cookieOptions));

След това в контролера можете да получите достъп до него по следния начин:

var cookieOptions = HttpContext.GetOwinContext().Get<MyCookieAuthOptions>().Options;

Контекстът на Owin поддържа само IDisposable обект, следователно трябва да обвием CookieAuthenticationOptions в IDisposable обект:

public class MyCookieAuthOptions : IDisposable
{
    public MyCookieAuthOptions(CookieAuthenticationOptions cookieOptions)
    {
        Options = cookieOptions;
    }

    public CookieAuthenticationOptions Options { get; }

    public void Dispose()
    {

    }
}
person Dávid Molnár    schedule 08.05.2017